diff options
author | Cameron Moore <moorereason@gmail.com> | 2020-08-27 21:34:45 -0500 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-08-28 09:54:51 +0200 |
commit | 047af7cfe5e9aa740b85e0f9974a2d31a0ef4c08 (patch) | |
tree | 764f73c08621753931897df9ec21cfbacb7b21d6 /tpl/collections/merge.go | |
parent | f9ebaaed1be1e4a26eef2aebd2c7554c979f29fa (diff) |
tpl: Extend merge to accept multiple parameters
Fixes #7595
Diffstat (limited to 'tpl/collections/merge.go')
-rw-r--r-- | tpl/collections/merge.go | 30 |
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. |