unmarshal: don't panic when storing table in slice (#641)
New error message: ``` toml: cannot store a table in a slice 1| [things] | ~~~~~~ cannot store a table in a slice 2| foo = "bar" ``` Fixes #623
This commit is contained in:
@@ -488,6 +488,9 @@ func (d *decoder) handleArrayTablePart(key ast.Iterator, v reflect.Value) (refle
|
|||||||
// cannot handle it.
|
// cannot handle it.
|
||||||
func (d *decoder) handleTable(key ast.Iterator, v reflect.Value) (reflect.Value, error) {
|
func (d *decoder) handleTable(key ast.Iterator, v reflect.Value) (reflect.Value, error) {
|
||||||
if v.Kind() == reflect.Slice {
|
if v.Kind() == reflect.Slice {
|
||||||
|
if v.Len() == 0 {
|
||||||
|
return reflect.Value{}, newDecodeError(key.Node().Data, "cannot store a table in a slice")
|
||||||
|
}
|
||||||
elem := v.Index(v.Len() - 1)
|
elem := v.Index(v.Len() - 1)
|
||||||
x, err := d.handleTable(key, elem)
|
x, err := d.handleTable(key, elem)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1810,6 +1810,18 @@ func TestIssue602(t *testing.T) {
|
|||||||
require.Equal(t, expected, v)
|
require.Equal(t, expected, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssue623(t *testing.T) {
|
||||||
|
definition := struct {
|
||||||
|
Things []string
|
||||||
|
}{}
|
||||||
|
|
||||||
|
values := `[things]
|
||||||
|
foo = "bar"`
|
||||||
|
|
||||||
|
err := toml.Unmarshal([]byte(values), &definition)
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
//nolint:funlen
|
//nolint:funlen
|
||||||
func TestUnmarshalDecodeErrors(t *testing.T) {
|
func TestUnmarshalDecodeErrors(t *testing.T) {
|
||||||
examples := []struct {
|
examples := []struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user