diff --git a/maputil/convert.go b/maputil/convert.go index 0c637f49b..24b49fca3 100644 --- a/maputil/convert.go +++ b/maputil/convert.go @@ -21,12 +21,11 @@ func KeyToLower(src map[string]string) map[string]string { // ToStringMap convert map[string]any to map[string]string func ToStringMap(src map[string]any) map[string]string { - newMp := make(map[string]string, len(src)) + strMp := make(map[string]string, len(src)) for k, v := range src { - newMp[k] = strutil.MustString(v) + strMp[k] = strutil.MustString(v) } - - return newMp + return strMp } // CombineToSMap combine two string-slice to SMap(map[string]string) diff --git a/maputil/data.go b/maputil/data.go index 0b0949f54..fad2f14fb 100644 --- a/maputil/data.go +++ b/maputil/data.go @@ -148,14 +148,15 @@ func (d Data) Bool(key string) bool { if !ok { return false } - if bl, ok := val.(bool); ok { - return bl - } - if str, ok := val.(string); ok { - return strutil.QuietBool(str) + switch tv := val.(type) { + case string: + return strutil.QuietBool(tv) + case bool: + return tv + default: + return false } - return false } // Strings get []string value @@ -193,6 +194,11 @@ func (d Data) StringsByStr(key string) []string { return nil } +// StrMap get map[string]string value +func (d Data) StrMap(key string) map[string]string { + return d.StringMap(key) +} + // StringMap get map[string]string value func (d Data) StringMap(key string) map[string]string { val, ok := d.GetByPath(key) @@ -200,10 +206,14 @@ func (d Data) StringMap(key string) map[string]string { return nil } - if smp, ok := val.(map[string]string); ok { - return smp + switch tv := val.(type) { + case map[string]string: + return tv + case map[string]any: + return ToStringMap(tv) + default: + return nil } - return nil } // Sub get sub value as new Data diff --git a/maputil/data_test.go b/maputil/data_test.go index f9b67ee29..87dc41ea1 100644 --- a/maputil/data_test.go +++ b/maputil/data_test.go @@ -11,11 +11,12 @@ import ( func TestData_usage(t *testing.T) { mp := maputil.Data{ - "k1": 23, - "k2": "ab", - "k3": "true", - "k4": false, - "k5": map[string]string{"a": "b"}, + "k1": 23, + "k2": "ab", + "k3": "true", + "k4": false, + "k5": map[string]string{"a": "b"}, + "anyMp": map[string]any{"b": 23}, } assert.True(t, mp.Has("k1")) @@ -23,6 +24,8 @@ func TestData_usage(t *testing.T) { assert.False(t, mp.Bool("k4")) assert.False(t, mp.IsEmtpy()) assert.Eq(t, 23, mp.Get("k1")) + assert.Eq(t, "b", mp.Get("k5.a")) + assert.Eq(t, 23, mp.Get("anyMp.b")) // int assert.Eq(t, 23, mp.Int("k1")) @@ -52,6 +55,7 @@ func TestData_usage(t *testing.T) { assert.Nil(t, mp.StringMap("notExists")) assert.Eq(t, map[string]string{"a": "b"}, mp.StringMap("k5")) + assert.Eq(t, map[string]string{"b": "23"}, mp.StringMap("anyMp")) } func TestData_SetByPath(t *testing.T) { @@ -60,6 +64,8 @@ func TestData_SetByPath(t *testing.T) { "k5": map[string]any{"a": "v0"}, } assert.Nil(t, mp.Get("k5.b")) + assert.Len(t, mp.Keys(), 2) + assert.NotEmpty(t, mp.ToStringMap()) err := mp.SetByPath("k5.b", "v2") assert.NoErr(t, err) diff --git a/maputil/maputil.go b/maputil/maputil.go index cd38198e1..7becfa7bf 100644 --- a/maputil/maputil.go +++ b/maputil/maputil.go @@ -23,7 +23,7 @@ func SimpleMerge(src, dst map[string]any) map[string]any { return dst } - if dst == nil { + if len(dst) == 0 { return src } @@ -43,6 +43,13 @@ func MergeSMap(src, dst map[string]string, ignoreCase bool) map[string]string { // MergeStringMap simple merge two string map. merge src to dst map func MergeStringMap(src, dst map[string]string, ignoreCase bool) map[string]string { + if len(src) == 0 { + return dst + } + if len(dst) == 0 { + return src + } + for k, v := range src { if ignoreCase { k = strings.ToLower(k)