diff --git a/internal/imported_tests/unmarshal_imported_test.go b/internal/imported_tests/unmarshal_imported_test.go index 1ea19c4..dda52d8 100644 --- a/internal/imported_tests/unmarshal_imported_test.go +++ b/internal/imported_tests/unmarshal_imported_test.go @@ -517,7 +517,6 @@ Str = "Hello" `) func TestPointerUnmarshal(t *testing.T) { - t.Log("TOML data:", string(pointerTestToml)) result := pointerMarshalTestStruct{} err := toml.Unmarshal(pointerTestToml, &result) require.NoError(t, err) diff --git a/targets.go b/targets.go index 028a92d..02db372 100644 --- a/targets.go +++ b/targets.go @@ -129,17 +129,29 @@ func ensureSlice(t target) error { } case reflect.Interface: if f.IsNil() { - return t.set(reflect.MakeSlice(reflect.TypeOf([]interface{}{}), 0, 0)) + return t.set(reflect.MakeSlice(sliceInterfaceType, 0, 0)) } if f.Type().Elem().Kind() != reflect.Slice { return fmt.Errorf("interface is pointing to a %s, not a slice", f.Kind()) } + case reflect.Ptr: + if f.IsNil() { + ptr := reflect.New(f.Type().Elem()) + err := t.set(ptr) + if err != nil { + return err + } + f = t.get() + } + return ensureSlice(valueTarget(f.Elem())) default: return fmt.Errorf("cannot initialize a slice in %s", f.Kind()) } return nil } +var sliceInterfaceType = reflect.TypeOf([]interface{}{}) + func setString(t target, v string) error { f := t.get() @@ -261,6 +273,8 @@ func pushNew(t target) (target, error) { return nil, err } return valueTarget(t.get().Elem().Index(idx)), nil + case reflect.Ptr: + return pushNew(valueTarget(f.Elem())) default: return nil, fmt.Errorf("cannot pushNew on a %s", f.Kind()) } diff --git a/unmarshaler_test.go b/unmarshaler_test.go index ad1730f..af399eb 100644 --- a/unmarshaler_test.go +++ b/unmarshaler_test.go @@ -572,6 +572,22 @@ B = "data"`, } }, }, + { + desc: "slice pointer in slice pointer", + input: `A = ["Hello"]`, + gen: func() test { + type doc struct { + A *[]*string + } + hello := "Hello" + return test{ + target: &doc{}, + expected: &doc{ + A: &[]*string{&hello}, + }, + } + }, + }, } for _, e := range examples {