Skip to content

Commit

Permalink
Decode: error on array table mismatched type (#804)
Browse files Browse the repository at this point in the history
Prevent the decoder from continuing if it encounters a type it cannot decode an
array table into.

Fixes #799
  • Loading branch information
pelletier committed Aug 15, 2022
1 parent 2d8433b commit 7baa23f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 2 deletions.
4 changes: 2 additions & 2 deletions unmarshaler.go
Expand Up @@ -344,9 +344,9 @@ func (d *decoder) handleArrayTableCollectionLast(key ast.Iterator, v reflect.Val
elem := v.Index(idx)
_, err := d.handleArrayTable(key, elem)
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
Expand Down
38 changes: 38 additions & 0 deletions unmarshaler_test.go
Expand Up @@ -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 {
Expand Down Expand Up @@ -2413,6 +2435,22 @@ Host = 'main.domain.com'
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) {
examples := []struct {
desc string
Expand Down

0 comments on commit 7baa23f

Please sign in to comment.