summaryrefslogtreecommitdiffstats
path: root/tpl/collections/merge.go
diff options
context:
space:
mode:
authorCameron Moore <moorereason@gmail.com>2020-08-27 21:34:45 -0500
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-08-28 09:54:51 +0200
commit047af7cfe5e9aa740b85e0f9974a2d31a0ef4c08 (patch)
tree764f73c08621753931897df9ec21cfbacb7b21d6 /tpl/collections/merge.go
parentf9ebaaed1be1e4a26eef2aebd2c7554c979f29fa (diff)
tpl: Extend merge to accept multiple parameters
Fixes #7595
Diffstat (limited to 'tpl/collections/merge.go')
-rw-r--r--tpl/collections/merge.go30
1 files changed, 23 insertions, 7 deletions
diff --git a/tpl/collections/merge.go b/tpl/collections/merge.go
index c65e9dd90..029416142 100644
--- a/tpl/collections/merge.go
+++ b/tpl/collections/merge.go
@@ -17,17 +17,35 @@ import (
"reflect"
"strings"
- "github.com/gohugoio/hugo/common/maps"
-
"github.com/gohugoio/hugo/common/hreflect"
+ "github.com/gohugoio/hugo/common/maps"
"github.com/pkg/errors"
)
-// Merge creates a copy of dst and merges src into it.
-// Currently only maps supported. Key handling is case insensitive.
-func (ns *Namespace) Merge(src, dst interface{}) (interface{}, error) {
+// Merge creates a copy of the final parameter and merges the preceeding
+// parameters into it in reverse order.
+// Currently only maps are supported. Key handling is case insensitive.
+func (ns *Namespace) Merge(params ...interface{}) (interface{}, error) {
+ if len(params) < 2 {
+ return nil, errors.New("merge requires at least two parameters")
+ }
+
+ var err error
+ result := params[len(params)-1]
+
+ for i := len(params) - 2; i >= 0; i-- {
+ result, err = ns.merge(params[i], result)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return result, nil
+}
+// merge creates a copy of dst and merges src into it.
+func (ns *Namespace) merge(src, dst interface{}) (interface{}, error) {
vdst, vsrc := reflect.ValueOf(dst), reflect.ValueOf(src)
if vdst.Kind() != reflect.Map {
@@ -60,14 +78,12 @@ func caseInsensitiveLookup(m, k reflect.Value) (reflect.Value, bool) {
if strings.EqualFold(k.String(), key.String()) {
return m.MapIndex(key), true
}
-
}
return reflect.Value{}, false
}
func mergeMap(dst, src reflect.Value) reflect.Value {
-
out := reflect.MakeMap(dst.Type())
// If the destination is Params, we must lower case all keys.