Skip to content

Commit

Permalink
✨ up(map): add new util func SimpleMerge() and Data.Load()
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Feb 25, 2023
1 parent 2052663 commit 87534df
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 3 deletions.
20 changes: 17 additions & 3 deletions maputil/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package maputil
import (
"strings"

"github.com/gookit/goutil/arrutil"
"github.com/gookit/goutil/mathutil"
"github.com/gookit/goutil/strutil"
)
Expand Down Expand Up @@ -164,10 +165,16 @@ func (d Data) Strings(key string) []string {
return nil
}

if ss, ok := val.([]string); ok {
return ss
switch typVal := val.(type) {
case string:
return []string{typVal}
case []string:
return typVal
case []any:
return arrutil.SliceToStrings(typVal)
default:
return nil
}
return nil
}

// StrSplit get strings by split key value
Expand Down Expand Up @@ -227,3 +234,10 @@ func (d Data) ToStringMap() map[string]string {
func (d Data) String() string {
return ToString(d)
}

// Load data to current data map
func (d Data) Load(sub map[string]any) {
for name, val := range sub {
d[name] = val
}
}
10 changes: 10 additions & 0 deletions maputil/data_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,16 @@ func TestData_SetByPath(t *testing.T) {
assert.NoErr(t, err)
// dump.P(mp)
assert.Eq(t, "v2", mp.Get("k5.b"))

mp.Load(map[string]any{"k2": "val2", "k3": "val3"})
assert.Eq(t, "val2", mp.Str("k2"))
assert.Eq(t, "val3", mp.Str("k3"))

// sub
assert.Nil(t, mp.Sub("not-exists"))
sub := mp.Sub("k5")
assert.Eq(t, "v0", sub.Get("a"))
assert.Eq(t, "v2", sub.Get("b"))
}

func TestData_SetByPath_case2(t *testing.T) {
Expand Down
20 changes: 20 additions & 0 deletions maputil/maputil.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,26 @@ const (
KeySepChar = '.'
)

// SimpleMerge simple merge two data map by string key.
// will merge the src to dst map
func SimpleMerge(src, dst map[string]any) map[string]any {
if len(src) == 0 {
return dst
}

if dst == nil {
return src
}

for key, val := range src {
dst[key] = val
}
return dst
}

// func DeepMerge(src, dst map[string]any, deep int) map[string]any {
// }

// MergeSMap simple merge two string map. merge src to dst map
func MergeSMap(src, dst map[string]string, ignoreCase bool) map[string]string {
return MergeStringMap(src, dst, ignoreCase)
Expand Down
15 changes: 15 additions & 0 deletions maputil/maputil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,21 @@ import (
"github.com/gookit/goutil/testutil/assert"
)

func TestSimpleMerge(t *testing.T) {
src := map[string]any{"A": "v0"}
dst := map[string]any{"A": "v1", "B": "v2"}
ret := maputil.SimpleMerge(src, dst)
assert.Len(t, ret, 2)
assert.Eq(t, "v0", ret["A"])

dst = map[string]any{"A": "v1", "B": "v2"}
ret = maputil.SimpleMerge(nil, dst)
assert.Eq(t, "v1", ret["A"])

ret = maputil.SimpleMerge(src, nil)
assert.Eq(t, "v0", ret["A"])
}

func TestMergeStringMap(t *testing.T) {
ret := maputil.MergeSMap(map[string]string{"A": "v0"}, map[string]string{"A": "v1"}, false)
assert.Eq(t, map[string]string{"A": "v0"}, ret)
Expand Down

0 comments on commit 87534df

Please sign in to comment.