Skip to content

Commit 049ba58

Browse files
committed
Add function to remove a child from tree
1 parent 852bf4a commit 049ba58

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

keyvalue.go

+17
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,23 @@ func (node *KeyValue) AddChild(value *KeyValue) error {
116116
return nil
117117
}
118118

119+
func (node *KeyValue) RemoveChild(key string) error {
120+
if !node.HasChildren() {
121+
return errors.New("parent does not accept child keys")
122+
}
123+
ret,err := node.Find(key)
124+
if err != nil {
125+
return errors.New("key does not exist")
126+
}
127+
for idx,c := range node.value {
128+
if c == ret {
129+
node.value = append(node.value[:idx], node.value[idx+1:]...)
130+
return nil
131+
}
132+
}
133+
return nil
134+
}
135+
119136
// Parent returns this node's parent.
120137
// Parent can be nil
121138
func (node *KeyValue) Parent() *KeyValue {

keyvalue_test.go

+70
Original file line numberDiff line numberDiff line change
@@ -242,3 +242,73 @@ func TestKeyValue_MergeInto(t *testing.T) {
242242
t.Error(err)
243243
}
244244
}
245+
246+
247+
func TestKeyValue_RemoveChild(t *testing.T) {
248+
a := &KeyValue{
249+
key: "foo",
250+
valueType: ValueArray,
251+
value: []interface{}{
252+
&KeyValue{
253+
key: "bar",
254+
valueType: ValueString,
255+
value: []interface{}{
256+
"bar",
257+
},
258+
},
259+
&KeyValue{
260+
key: "baz",
261+
valueType: ValueString,
262+
value: []interface{}{
263+
"baz",
264+
},
265+
},
266+
&KeyValue{
267+
key: "bat",
268+
valueType: ValueString,
269+
value: []interface{}{
270+
"bat",
271+
},
272+
},
273+
},
274+
}
275+
b := &KeyValue{
276+
key: "foo",
277+
valueType: ValueArray,
278+
value: []interface{}{
279+
&KeyValue{
280+
key: "bar",
281+
valueType: ValueString,
282+
value: []interface{}{
283+
"cart",
284+
},
285+
},
286+
&KeyValue{
287+
key: "egg",
288+
valueType: ValueString,
289+
value: []interface{}{
290+
"bat",
291+
},
292+
},
293+
},
294+
}
295+
296+
result,err := a.MergeInto(b)
297+
if err != nil {
298+
t.Error(err)
299+
}
300+
301+
actual,err := result.Find("bar")
302+
if actual == nil {
303+
t.Error(err)
304+
}
305+
err = result.RemoveChild("bar")
306+
if err != nil {
307+
t.Error(err)
308+
}
309+
actual,err = result.Find("bar")
310+
if actual != nil {
311+
t.Error("found key that should have been removed")
312+
}
313+
314+
}

0 commit comments

Comments
 (0)