diff options
| author | Dave Henderson <dhenderson@gmail.com> | 2019-01-29 22:00:57 -0500 |
|---|---|---|
| committer | Dave Henderson <dhenderson@gmail.com> | 2019-01-29 22:29:22 -0500 |
| commit | 8a50b114e18069b1be388102a128869a9861555b (patch) | |
| tree | ead9d88ba23658da8515c5b494971060b6effbfd /coll | |
| parent | 8695b4f6d86bfa3c241f65bf362e36600da97495 (diff) | |
New coll.Merge function
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'coll')
| -rw-r--r-- | coll/coll.go | 14 | ||||
| -rw-r--r-- | coll/coll_test.go | 31 |
2 files changed, 45 insertions, 0 deletions
diff --git a/coll/coll.go b/coll/coll.go index a9331055..40d2e9d5 100644 --- a/coll/coll.go +++ b/coll/coll.go @@ -5,6 +5,8 @@ import ( "reflect" "sort" + "github.com/imdario/mergo" + "github.com/hairyhenderson/gomplate/conv" "github.com/pkg/errors" ) @@ -162,3 +164,15 @@ func Reverse(list interface{}) ([]interface{}, error) { } return l, nil } + +// Merge source maps (srcs) into dst. Precedence is in left-to-right order, with +// the left-most values taking precedence over the right-most. +func Merge(dst map[string]interface{}, srcs ...map[string]interface{}) (map[string]interface{}, error) { + for _, src := range srcs { + err := mergo.Merge(&dst, src) + if err != nil { + return nil, err + } + } + return dst, nil +} diff --git a/coll/coll_test.go b/coll/coll_test.go index fff2b02f..db6d4d51 100644 --- a/coll/coll_test.go +++ b/coll/coll_test.go @@ -197,3 +197,34 @@ func TestReverse(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, []interface{}{4, 3, 2, 1}, out) } + +func TestMerge(t *testing.T) { + dst := map[string]interface{}{} + src := map[string]interface{}{} + expected := map[string]interface{}{} + + out, err := Merge(dst, src) + assert.NoError(t, err) + assert.EqualValues(t, expected, out) + + dst = map[string]interface{}{"a": 4, "c": 5} + src = map[string]interface{}{"a": 1, "b": 2, "c": 3} + expected = map[string]interface{}{ + "a": dst["a"], "b": src["b"], "c": dst["c"], + } + + out, err = Merge(dst, src) + assert.NoError(t, err) + assert.EqualValues(t, expected, out) + + dst = map[string]interface{}{"a": 4, "c": 5} + src = map[string]interface{}{"a": 1, "b": 2, "c": 3} + src2 := map[string]interface{}{"a": 1, "b": 2, "c": 3, "d": 4} + expected = map[string]interface{}{ + "a": dst["a"], "b": src["b"], "c": dst["c"], "d": src2["d"], + } + + out, err = Merge(dst, src, src2) + assert.NoError(t, err) + assert.EqualValues(t, expected, out) +} |
