Merge pull request #18 from simia-tech/master
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