extended Has function to work with paths
diff --git a/toml.go b/toml.go index a7918ba..84403fe 100644 --- a/toml.go +++ b/toml.go
@@ -18,16 +18,37 @@ // This is the result of the parsing of a TOML file. type TomlTree map[string]interface{} -// Has returns a boolean indicating if the toplevel tree contains the given -// key. +// Has returns a boolean indicating if the given key exists. func (t *TomlTree) Has(key string) bool { - mp := (map[string]interface{})(*t) - for k, _ := range mp { - if k == key { - return true + if key == "" { + return false + } + return t.HasPath(strings.Split(key, ".")) +} + +// Returns true if the given path of keys exists, false otherwise. +func (t *TomlTree) HasPath(keys []string) bool { + if len(keys) == 0 { + return false + } + subtree := t + for _, intermediate_key := range keys[:len(keys)-1] { + _, exists := (*subtree)[intermediate_key] + if !exists { + return false + } + switch node := (*subtree)[intermediate_key].(type) { + case *TomlTree: + subtree = node + case []*TomlTree: + // go to most recent element + if len(node) == 0 { + return false + } + subtree = node[len(node)-1] } } - return false + return true } // Keys returns the keys of the toplevel tree.
diff --git a/toml_test.go b/toml_test.go index 4b6610e..05a217e 100644 --- a/toml_test.go +++ b/toml_test.go
@@ -4,6 +4,28 @@ "testing" ) +func TestTomlHas(t *testing.T) { + tree, _ := Load(` + [test] + key = "value" + `) + + if !tree.Has("test.key") { + t.Errorf("Has - expected test.key to exists") + } +} + +func TestTomlHasPath(t *testing.T) { + tree, _ := Load(` + [test] + key = "value" + `) + + if !tree.HasPath([]string{"test", "key"}) { + t.Errorf("HasPath - expected test.key to exists") + } +} + func TestTomlGetPath(t *testing.T) { node := make(TomlTree) //TODO: set other node data