From c41dbba97dd2514b0cb1a54972160ec990aa43d8 Mon Sep 17 00:00:00 2001 From: Inhere Date: Mon, 19 Jun 2023 00:32:10 +0800 Subject: [PATCH] :sparkles: feat: maputil - add new util function StringsMapToAnyMap() --- maputil/convert.go | 24 ++++++++++++++++++++++++ maputil/convert_test.go | 19 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/maputil/convert.go b/maputil/convert.go index 4ded4cfde..13d4b0cf3 100644 --- a/maputil/convert.go +++ b/maputil/convert.go @@ -74,6 +74,30 @@ func HTTPQueryString(data map[string]any) string { return strings.Join(ss, "&") } +// StringsMapToAnyMap convert map[string][]string to map[string]any +// +// Example: +// {"k1": []string{"v1", "v2"}, "k2": []string{"v3"}} +// => +// {"k": []string{"v1", "v2"}, "k2": "v3"} +// +// mp := StringsMapToAnyMap(httpReq.Header) +func StringsMapToAnyMap(ssMp map[string][]string) map[string]any { + if len(ssMp) == 0 { + return nil + } + + anyMp := make(map[string]any, len(ssMp)) + for k, v := range ssMp { + if len(v) == 1 { + anyMp[k] = v[0] + continue + } + anyMp[k] = v + } + return anyMp +} + // ToString simple and quickly convert map[string]any to string. func ToString(mp map[string]any) string { if mp == nil { diff --git a/maputil/convert_test.go b/maputil/convert_test.go index 44dac1f95..30d5c589d 100644 --- a/maputil/convert_test.go +++ b/maputil/convert_test.go @@ -2,6 +2,7 @@ package maputil_test import ( "fmt" + "net/http" "testing" "github.com/gookit/goutil/dump" @@ -100,3 +101,21 @@ func TestFlatten(t *testing.T) { maputil.FlatWithFunc(nil, nil) }) } + +func TestStringsMapToAnyMap(t *testing.T) { + assert.Nil(t, maputil.StringsMapToAnyMap(nil)) + + hh := http.Header{ + "key0": []string{"val0", "val1"}, + "key1": []string{"val2"}, + } + + mp := maputil.StringsMapToAnyMap(hh) + assert.Contains(t, mp, "key0") + assert.Contains(t, mp, "key1") + assert.Len(t, mp["key0"], 2) + + dm := maputil.Data(mp) + assert.Eq(t, "val0", dm.Str("key0.0")) + assert.Eq(t, "val2", dm.Str("key1")) +}