Delete function to Tree (#256)
Adds delete* functions to the tree so that keys can be removed programatically.
This commit is contained in:
committed by
Thomas Pelletier
parent
489c49b1b4
commit
ad2aec1dcc
@@ -292,6 +292,34 @@ func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool,
|
|||||||
subtree.values[keys[len(keys)-1]] = toInsert
|
subtree.values[keys[len(keys)-1]] = toInsert
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete removes a key from the tree.
|
||||||
|
// Key is a dot-separated path (e.g. a.b.c).
|
||||||
|
func (t *Tree) Delete(key string) error {
|
||||||
|
keys, err := parseKey(key)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return t.DeletePath(keys)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete removes a key from the tree.
|
||||||
|
// Keys is an array of path elements (e.g. {"a","b","c"}).
|
||||||
|
func (t *Tree) DeletePath(keys []string) error {
|
||||||
|
keyLen := len(keys)
|
||||||
|
if keyLen == 1 {
|
||||||
|
delete(t.values, keys[0])
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tree := t.GetPath(keys[:keyLen-1])
|
||||||
|
item := keys[keyLen-1]
|
||||||
|
switch node := tree.(type) {
|
||||||
|
case *Tree:
|
||||||
|
delete(node.values, item)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return errors.New("no such key to delete")
|
||||||
|
}
|
||||||
|
|
||||||
// createSubTree takes a tree and a key and create the necessary intermediate
|
// createSubTree takes a tree and a key and create the necessary intermediate
|
||||||
// subtrees to create a subtree at that point. In-place.
|
// subtrees to create a subtree at that point. In-place.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -69,6 +69,60 @@ func TestTomlHasPath(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTomlDelete(t *testing.T) {
|
||||||
|
tree, _ := Load(`
|
||||||
|
key = "value"
|
||||||
|
`)
|
||||||
|
err := tree.Delete("key")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Delete - unexpected error while deleting key: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if tree.Get("key") != nil {
|
||||||
|
t.Errorf("Delete should have removed key but did not.")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTomlDeleteUnparsableKey(t *testing.T) {
|
||||||
|
tree, _ := Load(`
|
||||||
|
key = "value"
|
||||||
|
`)
|
||||||
|
err := tree.Delete(".")
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("Delete should error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTomlDeleteNestedKey(t *testing.T) {
|
||||||
|
tree, _ := Load(`
|
||||||
|
[foo]
|
||||||
|
[foo.bar]
|
||||||
|
key = "value"
|
||||||
|
`)
|
||||||
|
err := tree.Delete("foo.bar.key")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error while deleting nested key: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if tree.Get("key") != nil {
|
||||||
|
t.Errorf("Delete should have removed nested key but did not.")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTomlDeleteNonexistentNestedKey(t *testing.T) {
|
||||||
|
tree, _ := Load(`
|
||||||
|
[foo]
|
||||||
|
[foo.bar]
|
||||||
|
key = "value"
|
||||||
|
`)
|
||||||
|
err := tree.Delete("foo.not.there.key")
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("Delete should have thrown an error trying to delete key in nonexistent tree")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestTomlGetPath(t *testing.T) {
|
func TestTomlGetPath(t *testing.T) {
|
||||||
node := newTree()
|
node := newTree()
|
||||||
//TODO: set other node data
|
//TODO: set other node data
|
||||||
|
|||||||
Reference in New Issue
Block a user