Fixed path handling and key group array name lexing for test compliance
diff --git a/lexer.go b/lexer.go index 162885a..a995a02 100644 --- a/lexer.go +++ b/lexer.go
@@ -417,7 +417,9 @@ l.pos += 1 l.emit(tokenDoubleRightBracket) return lexVoid - } + } else if l.peek() == '[' { + return l.errorf("group name cannot contain ']'") + } if l.next() == eof { break @@ -436,7 +438,9 @@ l.pos += 1 l.emit(tokenRightBracket) return lexVoid - } + } else if l.peek() == '[' { + return l.errorf("group name cannot contain ']'") + } if l.next() == eof { break
diff --git a/toml.go b/toml.go index cafad2c..b5b0d57 100644 --- a/toml.go +++ b/toml.go
@@ -64,7 +64,16 @@ if !exists { return nil } - subtree = (*subtree)[intermediate_key].(*TomlTree) + switch node := (*subtree)[intermediate_key].(type) { + case *TomlTree: + subtree = node + case []*TomlTree: + // go to most recent element + if len(node) == 0 { + return nil //(*subtree)[intermediate_key] = append(node, &TomlTree{}) + } + subtree = node[len(node)-1] + } } return (*subtree)[keys[len(keys)-1]] } @@ -93,7 +102,16 @@ var new_tree TomlTree = make(TomlTree) (*subtree)[intermediate_key] = &new_tree } - subtree = (*subtree)[intermediate_key].(*TomlTree) + switch node := (*subtree)[intermediate_key].(type) { + case *TomlTree: + subtree = node + case []*TomlTree: + // go to most recent element + if len(node) == 0 { + (*subtree)[intermediate_key] = append(node, &TomlTree{}) + } + subtree = node[len(node)-1] + } } (*subtree)[keys[len(keys)-1]] = value }