diff --git a/parser.go b/parser.go index e9c9f52..54750c3 100644 --- a/parser.go +++ b/parser.go @@ -4,6 +4,7 @@ package toml import ( "fmt" + "reflect" "strconv" "time" ) @@ -146,6 +147,7 @@ func parseRvalue(p *parser) interface{} { func parseArray(p *parser) []interface{} { array := make([]interface{}, 0) + arrayType := reflect.TypeOf(nil) for { follow := p.peek() if follow == nil || follow.typ == tokenEOF { @@ -156,6 +158,12 @@ func parseArray(p *parser) []interface{} { return array } val := parseRvalue(p) + if arrayType == nil { + arrayType = reflect.TypeOf(val) + } + if reflect.TypeOf(val) != arrayType { + panic("mixed types in array") + } array = append(array, val) follow = p.peek() if follow == nil { diff --git a/parser_test.go b/parser_test.go index 629e0a6..1f55faa 100644 --- a/parser_test.go +++ b/parser_test.go @@ -142,6 +142,18 @@ func TestArrayNested(t *testing.T) { }) } +func TestArrayMixedTypes(t *testing.T) { + _, err := Load("a = [42, 16.0]") + if err.Error() != "mixed types in array" { + t.Error("Bad error message:", err.Error()) + } + + _, err = Load("a = [42, \"hello\"]") + if err.Error() != "mixed types in array" { + t.Error("Bad error message:", err.Error()) + } +} + func TestArrayNestedStrings(t *testing.T) { tree, err := Load("data = [ [\"gamma\", \"delta\"], [\"Foo\"] ]") assertTree(t, tree, err, map[string]interface{}{