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