From 78129222005b30f10cd248ad7d916f15bdcd7ed5 Mon Sep 17 00:00:00 2001 From: Jan Semmelink <jan@uafrica.com> Date: Thu, 14 Oct 2021 15:25:38 +0200 Subject: [PATCH] Add support for parsing URL values [a,b,c] into array of 3 strings --- api/context.go | 6 +++++- api/params_test.go | 9 ++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/api/context.go b/api/context.go index c559326..26e7fb2 100644 --- a/api/context.go +++ b/api/context.go @@ -100,7 +100,11 @@ func (ctx apiContext) extract(name string, t reflect.Type, v reflect.Value) erro //get value(s) from query string var paramStrValues []string if paramStrValue, isDefined := ctx.request.QueryStringParameters[n]; isDefined { - paramStrValues = []string{paramStrValue} //single value + if len(paramStrValue) >= 2 && paramStrValue[0] == '[' && paramStrValue[len(paramStrValue)-1] == ']' { + paramStrValues = strings.Split(paramStrValue[1:len(paramStrValue)-1], ",") //from [CSV] + } else { + paramStrValues = []string{paramStrValue} //single value + } } else { paramStrValues = ctx.request.MultiValueQueryStringParameters[n] } diff --git a/api/params_test.go b/api/params_test.go index ae0a415..7e21c3f 100644 --- a/api/params_test.go +++ b/api/params_test.go @@ -83,6 +83,7 @@ type MyGetParams struct { Find string `json:"find"` Find1 []string `json:"find1"` Find2 []string `json:"find2"` + Find3 []string `json:"find3"` } func TestGet(t *testing.T) { @@ -98,8 +99,9 @@ func TestGet(t *testing.T) { "id": "1", "limit": "2", "offset": "3", - "search": "4", //single value parts into string - "find1": "sarel", //single value parsed into array + "search": "4", //single value parts into string + "find1": "sarel", //single value parsed into array + "find3": "[hendrik,,frederik,johan]", //array of 4 values in CSV notation }, MultiValueQueryStringParameters: map[string][]string{ "find2": {"hans", "gert"}, //multi-values parsed into array @@ -117,7 +119,8 @@ func TestGet(t *testing.T) { t.Logf("get: %+v", get) if get.ID != 1 || get.Offset != 3 || get.Limit != 2 || get.Search != "4" || get.Find != "koos" || len(get.Find1) != 1 || get.Find1[0] != "sarel" || - len(get.Find2) != 2 || get.Find2[0] != "hans" || get.Find2[1] != "gert" { + len(get.Find2) != 2 || get.Find2[0] != "hans" || get.Find2[1] != "gert" || + len(get.Find3) != 4 || get.Find3[0] != "hendrik" || get.Find3[1] != "" || get.Find3[2] != "frederik" || get.Find3[3] != "johan" { t.Fatalf("wrong values") } } -- GitLab