diff --git a/dom/container.go b/dom/container.go index 08303c4..e120d45 100644 --- a/dom/container.go +++ b/dom/container.go @@ -190,6 +190,12 @@ func (c *containerBuilderImpl) Walk(fn WalkFn) { } } +func (c *containerBuilderImpl) Merge(other Container, opts ...MergeOption) ContainerBuilder { + m := &merger{} + m.init(opts...) + return m.mergeContainers(c, other) +} + func (c *containerBuilderImpl) AddList(name string) ListBuilder { lb := &listBuilderImpl{} c.add(name, lb) diff --git a/dom/container_test.go b/dom/container_test.go index 1d7a5ae..3dff2e8 100644 --- a/dom/container_test.go +++ b/dom/container_test.go @@ -317,3 +317,15 @@ func TestContainerClone(t *testing.T) { assert.Equal(t, 123, c2.Lookup("a.x.y").(Leaf).Value()) assert.Equal(t, "123", c2.Lookup("a.b[1]").(Leaf).Value()) } + +func TestMergeContainers(t *testing.T) { + a := b.Container() + c := b.Container() + a.AddValueAt("l1.l2c", LeafNode(7)) + a.AddValueAt("l1.l2d", LeafNode("0987")) + c.AddValueAt("l1.l2a", LeafNode("123")) + c.AddValueAt("l1.l2b", LeafNode("abc")) + d := c.Merge(a) + assert.Equal(t, 4, len(d.Lookup("l1").(Container).Children())) + assert.Equal(t, "abc", d.Lookup("l1.l2b").(Leaf).Value()) +} diff --git a/dom/merge.go b/dom/merge.go index c6d4cf7..6af47ff 100644 --- a/dom/merge.go +++ b/dom/merge.go @@ -77,7 +77,7 @@ func (mg *merger) mergeListsMeld(l1, l2 List) List { return l } -func (mg *merger) mergeContainers(c1, c2 Container) Container { +func (mg *merger) mergeContainers(c1, c2 Container) ContainerBuilder { merged := map[string]Node{} for k, v := range c1.Children() { merged[k] = v diff --git a/dom/types.go b/dom/types.go index 60d2ce0..eb9208d 100644 --- a/dom/types.go +++ b/dom/types.go @@ -141,6 +141,8 @@ type ContainerBuilder interface { RemoveAt(path string) // Walk walks whole document tree, visiting every node Walk(fn WalkFn) + // Merge creates new Container instance and merge current Container with other into it. + Merge(other Container, opts ...MergeOption) ContainerBuilder } type WalkFn func(path string, parent ContainerBuilder, node Node) bool