Allocate slice if needed
This commit is contained in:
@@ -1827,9 +1827,7 @@ type arrayTooSmallStruct struct {
|
||||
func TestUnmarshalSlice(t *testing.T) {
|
||||
var actual sliceStruct
|
||||
err := toml.Unmarshal(sliceTomlDemo, &actual)
|
||||
if err != nil {
|
||||
t.Error("shound not err", err)
|
||||
}
|
||||
require.NoError(t, err)
|
||||
expected := sliceStruct{
|
||||
Slice: []string{"Howdy", "Hey There"},
|
||||
SlicePtr: &[]string{"Howdy", "Hey There"},
|
||||
@@ -1838,10 +1836,7 @@ func TestUnmarshalSlice(t *testing.T) {
|
||||
StructSlice: []basicMarshalTestSubStruct{{"1"}, {"2"}},
|
||||
StructSlicePtr: &[]basicMarshalTestSubStruct{{"1"}, {"2"}},
|
||||
}
|
||||
if !reflect.DeepEqual(actual, expected) {
|
||||
t.Errorf("Bad unmarshal: expected %v, got %v", expected, actual)
|
||||
}
|
||||
|
||||
assert.Equal(t, expected, actual)
|
||||
}
|
||||
|
||||
func TestUnmarshalSliceFail(t *testing.T) {
|
||||
|
||||
@@ -380,6 +380,12 @@ func (b *Builder) SliceNewElem() error {
|
||||
v := t.get()
|
||||
|
||||
if v.Kind() == reflect.Ptr {
|
||||
// if the pointer is nil we need to allocate the slice
|
||||
if v.IsNil() {
|
||||
x := reflect.New(v.Type().Elem())
|
||||
v.Set(x)
|
||||
}
|
||||
// target the slice itself
|
||||
v = v.Elem()
|
||||
}
|
||||
|
||||
|
||||
+7
-7
@@ -165,7 +165,7 @@ func (u *unmarshaler) BoolValue(b bool) {
|
||||
if u.skipping() || u.err != nil {
|
||||
return
|
||||
}
|
||||
if u.builder.IsSlice() {
|
||||
if u.builder.IsSliceOrPtr() {
|
||||
u.builder.Save()
|
||||
u.err = u.builder.SliceAppend(reflect.ValueOf(&b))
|
||||
if u.err != nil {
|
||||
@@ -181,7 +181,7 @@ func (u *unmarshaler) FloatValue(n float64) {
|
||||
if u.skipping() || u.err != nil {
|
||||
return
|
||||
}
|
||||
if u.builder.IsSlice() {
|
||||
if u.builder.IsSliceOrPtr() {
|
||||
u.builder.Save()
|
||||
u.err = u.builder.SliceAppend(reflect.ValueOf(&n))
|
||||
if u.err != nil {
|
||||
@@ -198,7 +198,7 @@ func (u *unmarshaler) IntValue(n int64) {
|
||||
if u.skipping() || u.err != nil {
|
||||
return
|
||||
}
|
||||
if u.builder.IsSlice() {
|
||||
if u.builder.IsSliceOrPtr() {
|
||||
u.builder.Save()
|
||||
u.err = u.builder.SliceAppend(reflect.ValueOf(&n))
|
||||
if u.err != nil {
|
||||
@@ -214,7 +214,7 @@ func (u *unmarshaler) LocalDateValue(date LocalDate) {
|
||||
if u.skipping() || u.err != nil {
|
||||
return
|
||||
}
|
||||
if u.builder.IsSlice() {
|
||||
if u.builder.IsSliceOrPtr() {
|
||||
u.builder.Save()
|
||||
u.err = u.builder.SliceAppend(reflect.ValueOf(&date))
|
||||
if u.err != nil {
|
||||
@@ -230,7 +230,7 @@ func (u *unmarshaler) LocalDateTimeValue(dt LocalDateTime) {
|
||||
if u.skipping() || u.err != nil {
|
||||
return
|
||||
}
|
||||
if u.builder.IsSlice() {
|
||||
if u.builder.IsSliceOrPtr() {
|
||||
u.builder.Save()
|
||||
u.err = u.builder.SliceAppend(reflect.ValueOf(&dt))
|
||||
if u.err != nil {
|
||||
@@ -246,7 +246,7 @@ func (u *unmarshaler) DateTimeValue(dt time.Time) {
|
||||
if u.skipping() || u.err != nil {
|
||||
return
|
||||
}
|
||||
if u.builder.IsSlice() {
|
||||
if u.builder.IsSliceOrPtr() {
|
||||
u.builder.Save()
|
||||
u.err = u.builder.SliceAppend(reflect.ValueOf(&dt))
|
||||
if u.err != nil {
|
||||
@@ -262,7 +262,7 @@ func (u *unmarshaler) LocalTimeValue(localTime LocalTime) {
|
||||
if u.skipping() || u.err != nil {
|
||||
return
|
||||
}
|
||||
if u.builder.IsSlice() {
|
||||
if u.builder.IsSliceOrPtr() {
|
||||
u.builder.Save()
|
||||
u.err = u.builder.SliceAppend(reflect.ValueOf(&localTime))
|
||||
if u.err != nil {
|
||||
|
||||
Reference in New Issue
Block a user