Decode: error on array table mismatched type (#804)
Prevent the decoder from continuing if it encounters a type it cannot decode an array table into. Fixes #799
This commit is contained in:
+2
-2
@@ -344,9 +344,9 @@ func (d *decoder) handleArrayTableCollectionLast(key ast.Iterator, v reflect.Val
|
|||||||
elem := v.Index(idx)
|
elem := v.Index(idx)
|
||||||
_, err := d.handleArrayTable(key, elem)
|
_, err := d.handleArrayTable(key, elem)
|
||||||
return v, err
|
return v, err
|
||||||
|
default:
|
||||||
|
return reflect.Value{}, fmt.Errorf("toml: cannot decode array table into a %s", v.Type())
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.handleArrayTable(key, v)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// When parsing an array table expression, each part of the key needs to be
|
// When parsing an array table expression, each part of the key needs to be
|
||||||
|
|||||||
@@ -1735,6 +1735,28 @@ B = "data"`,
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "kv that points to a slice",
|
||||||
|
input: "a.b.c = 'foo'",
|
||||||
|
gen: func() test {
|
||||||
|
doc := map[string][]string{}
|
||||||
|
return test{
|
||||||
|
target: &doc,
|
||||||
|
err: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "kv that points to a pointer to a slice",
|
||||||
|
input: "a.b.c = 'foo'",
|
||||||
|
gen: func() test {
|
||||||
|
doc := map[string]*[]string{}
|
||||||
|
return test{
|
||||||
|
target: &doc,
|
||||||
|
err: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, e := range examples {
|
for _, e := range examples {
|
||||||
@@ -2413,6 +2435,22 @@ Host = 'main.domain.com'
|
|||||||
require.Equal(t, expected, string(b))
|
require.Equal(t, expected, string(b))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssue799(t *testing.T) {
|
||||||
|
const testTOML = `
|
||||||
|
# notice the double brackets
|
||||||
|
[[test]]
|
||||||
|
answer = 42
|
||||||
|
`
|
||||||
|
|
||||||
|
var s struct {
|
||||||
|
// should be []map[string]int
|
||||||
|
Test map[string]int `toml:"test"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := toml.Unmarshal([]byte(testTOML), &s)
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnmarshalDecodeErrors(t *testing.T) {
|
func TestUnmarshalDecodeErrors(t *testing.T) {
|
||||||
examples := []struct {
|
examples := []struct {
|
||||||
desc string
|
desc string
|
||||||
|
|||||||
Reference in New Issue
Block a user