summaryrefslogtreecommitdiff
path: root/coll
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2019-01-29 22:00:57 -0500
committerDave Henderson <dhenderson@gmail.com>2019-01-29 22:29:22 -0500
commit8a50b114e18069b1be388102a128869a9861555b (patch)
treeead9d88ba23658da8515c5b494971060b6effbfd /coll
parent8695b4f6d86bfa3c241f65bf362e36600da97495 (diff)
New coll.Merge function
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'coll')
-rw-r--r--coll/coll.go14
-rw-r--r--coll/coll_test.go31
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)
+}