From 64941b99e2bfbaf6f1c1fcfefd51d055beaafcbf Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Mon, 25 Oct 2021 15:55:54 -0400 Subject: [PATCH] unmarshal: empty document results in map (#640) Fixes #602 --- unmarshaler.go | 8 +++++++- unmarshaler_test.go | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/unmarshaler.go b/unmarshaler.go index 19efaa4..6e3abc6 100644 --- a/unmarshaler.go +++ b/unmarshaler.go @@ -174,7 +174,13 @@ func (d *decoder) FromParser(v interface{}) error { return fmt.Errorf("toml: decoding pointer target cannot be nil") } - err := d.fromParser(r.Elem()) + r = r.Elem() + if r.Kind() == reflect.Interface && r.IsNil() { + newMap := map[string]interface{}{} + r.Set(reflect.ValueOf(newMap)) + } + + err := d.fromParser(r) if err == nil { return d.strict.Error(d.p.data) } diff --git a/unmarshaler_test.go b/unmarshaler_test.go index 4374d87..362e937 100644 --- a/unmarshaler_test.go +++ b/unmarshaler_test.go @@ -1800,6 +1800,16 @@ func TestIssue596(t *testing.T) { require.Error(t, err) } +func TestIssue602(t *testing.T) { + var v interface{} + err := toml.Unmarshal([]byte(""), &v) + require.NoError(t, err) + + var expected interface{} = map[string]interface{}{} + + require.Equal(t, expected, v) +} + //nolint:funlen func TestUnmarshalDecodeErrors(t *testing.T) { examples := []struct {