Add some helpers for tree manipulation
diff --git a/src/toml/parser.go b/src/toml/parser.go index f9592b7..6dd9b16 100644 --- a/src/toml/parser.go +++ b/src/toml/parser.go
@@ -1,3 +1,29 @@ // TOML Parser. 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 +}
diff --git a/src/toml/parser_test.go b/src/toml/parser_test.go new file mode 100644 index 0000000..1dcbc70 --- /dev/null +++ b/src/toml/parser_test.go
@@ -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() + } +}
diff --git a/src/toml/toml.go b/src/toml/toml.go index 1b558cc..f0779d5 100644 --- a/src/toml/toml.go +++ b/src/toml/toml.go
@@ -2,7 +2,47 @@ package toml -func Load() map[string]interface{} { - result := make(map[string]interface{}) +import ( + "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 }