diff --git a/marshal.go b/marshal.go index 2571448a..2e16a384 100644 --- a/marshal.go +++ b/marshal.go @@ -514,11 +514,19 @@ func (d *Decoder) SetTagName(v string) *Decoder { func (d *Decoder) unmarshal(v interface{}) error { mtype := reflect.TypeOf(v) - if mtype.Kind() != reflect.Ptr || mtype.Elem().Kind() != reflect.Struct { - return errors.New("Only a pointer to struct can be unmarshaled from TOML") + if mtype.Kind() != reflect.Ptr { + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } - sval, err := d.valueFromTree(mtype.Elem(), d.tval) + elem := mtype.Elem() + + switch elem.Kind() { + case reflect.Struct, reflect.Map: + default: + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") + } + + sval, err := d.valueFromTree(elem, d.tval) if err != nil { return err } diff --git a/marshal_test.go b/marshal_test.go index 712433ad..999235fa 100644 --- a/marshal_test.go +++ b/marshal_test.go @@ -1103,12 +1103,42 @@ func TestUnmarshalCustomTag(t *testing.T) { } func TestUnmarshalMap(t *testing.T) { - m := make(map[string]int) - m["a"] = 1 + testToml := []byte(` + a = 1 + b = 2 + c = 3 + `) + var result map[string]int + err := Unmarshal(testToml, &result) + if err != nil { + t.Errorf("Received unexpected error: %s", err) + return + } - err := Unmarshal(basicTestToml, m) - if err.Error() != "Only a pointer to struct can be unmarshaled from TOML" { - t.Fail() + expected := map[string]int{ + "a": 1, + "b": 2, + "c": 3, + } + + if !reflect.DeepEqual(result, expected) { + t.Errorf("Bad unmarshal: expected %v, got %v", expected, result) + } +} + +func TestUnmarshalNonPointer(t *testing.T) { + a := 1 + err := Unmarshal([]byte{}, a) + if err == nil { + t.Fatal("unmarshal should err when given a non pointer") + } +} + +func TestUnmarshalInvalidPointerKind(t *testing.T) { + a := 1 + err := Unmarshal([]byte{}, &a) + if err == nil { + t.Fatal("unmarshal should err when given an invalid pointer type") } }