Add some helpers for tree manipulation
This commit is contained in:
@@ -1,3 +1,29 @@
|
|||||||
// TOML Parser.
|
// TOML Parser.
|
||||||
|
|
||||||
package toml
|
package toml
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Given a tree and a key, create the necessary intermediate subtrees to create
|
||||||
|
// a subtree at that point. In-place.
|
||||||
|
//
|
||||||
|
// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b]
|
||||||
|
// and tree[a][b][c]
|
||||||
|
func createSubTree(tree *tomlTree, key string) {
|
||||||
|
subtree := tree
|
||||||
|
for _, intermediate_key := range strings.Split(key, ".") {
|
||||||
|
_, exists := (*subtree)[intermediate_key]
|
||||||
|
if !exists {
|
||||||
|
(*subtree)[intermediate_key] = make(tomlTree)
|
||||||
|
}
|
||||||
|
subtree = (*subtree)[intermediate_key].(*tomlTree)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func parse(chan token) *tomlTree {
|
||||||
|
result := make(tomlTree)
|
||||||
|
return &result
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package toml
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
|
||||||
|
func testCreateSubTree(t *testing.T) {
|
||||||
|
tree := make(tomlTree)
|
||||||
|
createSubTree(&tree, "a.b.c")
|
||||||
|
tree.Set("a.b.c", 42)
|
||||||
|
if tree.Get("a.b.c") != 42 {
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
+42
-2
@@ -2,7 +2,47 @@
|
|||||||
|
|
||||||
package toml
|
package toml
|
||||||
|
|
||||||
func Load() map[string]interface{} {
|
import (
|
||||||
result := make(map[string]interface{})
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Definition of a tomlTree
|
||||||
|
type tomlTree map[string]interface{}
|
||||||
|
|
||||||
|
// Retrieve an element from the tree.
|
||||||
|
//
|
||||||
|
// If the path described by the key does not exist, nil is returned.
|
||||||
|
func (t *tomlTree) Get(key string) interface{} {
|
||||||
|
subtree := t
|
||||||
|
keys := strings.Split(key, ".")
|
||||||
|
for _, intermediate_key := range keys[:len(keys)-1] {
|
||||||
|
_, exists := (*subtree)[intermediate_key]
|
||||||
|
if !exists {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
subtree = (*subtree)[intermediate_key].(*tomlTree)
|
||||||
|
}
|
||||||
|
return (*subtree)[keys[len(keys) - 1]]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set an element in the tree.
|
||||||
|
//
|
||||||
|
// Creates all necessary intermediates trees, if needed.
|
||||||
|
func (t *tomlTree) Set(key string, value interface{}) {
|
||||||
|
subtree := t
|
||||||
|
keys := strings.Split(key, ".")
|
||||||
|
for _, intermediate_key := range keys[:len(keys)-1] {
|
||||||
|
_, exists := (*subtree)[intermediate_key]
|
||||||
|
if !exists {
|
||||||
|
(*subtree)[intermediate_key] = make(tomlTree)
|
||||||
|
}
|
||||||
|
subtree = (*subtree)[intermediate_key].(*tomlTree)
|
||||||
|
}
|
||||||
|
(*subtree)[keys[len(key) - 1]] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func Load() tomlTree {
|
||||||
|
result := make(tomlTree)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user