Allow empty quoted keys (#97)
diff --git a/keysparsing.go b/keysparsing.go
index 4deed81..b67664f 100644
--- a/keysparsing.go
+++ b/keysparsing.go
@@ -12,6 +12,7 @@
groups := []string{}
var buffer bytes.Buffer
inQuotes := false
+ wasInQuotes := false
escapeNext := false
ignoreSpace := true
expectDot := false
@@ -33,16 +34,27 @@
escapeNext = true
continue
case '"':
+ if inQuotes {
+ groups = append(groups, buffer.String())
+ buffer.Reset()
+ wasInQuotes = true
+ }
inQuotes = !inQuotes
expectDot = false
case '.':
if inQuotes {
buffer.WriteRune(char)
} else {
- groups = append(groups, buffer.String())
- buffer.Reset()
+ if !wasInQuotes {
+ if buffer.Len() == 0 {
+ return nil, fmt.Errorf("empty key group")
+ }
+ groups = append(groups, buffer.String())
+ buffer.Reset()
+ }
ignoreSpace = true
expectDot = false
+ wasInQuotes = false
}
case ' ':
if inQuotes {
diff --git a/keysparsing_test.go b/keysparsing_test.go
index ef7e2a5..1a9eccc 100644
--- a/keysparsing_test.go
+++ b/keysparsing_test.go
@@ -7,6 +7,7 @@
func testResult(t *testing.T, key string, expected []string) {
parsed, err := parseKey(key)
+ t.Logf("key=%s expected=%s parsed=%s", key, expected, parsed)
if err != nil {
t.Fatal("Unexpected error:", err)
}
@@ -43,7 +44,13 @@
testError(t, "hello#world", "invalid bare character: #")
}
+func TestQuotedKeys(t *testing.T) {
+ testResult(t, `hello."foo".bar`, []string{"hello", "foo", "bar"})
+ testResult(t, `"hello!"`, []string{"hello!"})
+}
+
func TestEmptyKey(t *testing.T) {
testError(t, "", "empty key")
testError(t, " ", "empty key")
+ testResult(t, `""`, []string{""})
}
diff --git a/parser_test.go b/parser_test.go
index 7f32ea8..8f80a14 100644
--- a/parser_test.go
+++ b/parser_test.go
@@ -177,6 +177,16 @@
})
}
+func TestEmptyQuotedString(t *testing.T) {
+ tree, err := Load(`[""]
+"" = 1`)
+ assertTree(t, tree, err, map[string]interface{}{
+ "": map[string]interface{}{
+ "": int64(1),
+ },
+ })
+}
+
func TestBools(t *testing.T) {
tree, err := Load("a = true\nb = false")
assertTree(t, tree, err, map[string]interface{}{
@@ -446,7 +456,7 @@
func TestEmptyIntermediateTable(t *testing.T) {
_, err := Load("[foo..bar]")
- if err.Error() != "(1, 2): empty intermediate table" {
+ if err.Error() != "(1, 2): invalid group array key: empty key group" {
t.Error("Bad error message:", err.Error())
}
}
diff --git a/toml.go b/toml.go
index c0e1ad2..ad23fe8 100644
--- a/toml.go
+++ b/toml.go
@@ -222,9 +222,6 @@
func (t *TomlTree) createSubTree(keys []string, pos Position) error {
subtree := t
for _, intermediateKey := range keys {
- if intermediateKey == "" {
- return fmt.Errorf("empty intermediate table")
- }
nextTree, exists := subtree.values[intermediateKey]
if !exists {
tree := newTomlTree()