diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index 780b2420..a8be682c 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -448,10 +448,12 @@ func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value, map dereffedBaseType := Deref(baseType) dereffedBaseKind := dereffedBaseType.Kind() refValue := reflect.ValueOf(mapValue) - conv := reflect.MakeSlice(reflect.SliceOf(baseType), refValue.Len(), refValue.Cap()) + if refValue.IsNil() { + return nil + } - // support for empty slice - if !refValue.IsNil() && refValue.Len() == 0 { + conv := reflect.MakeSlice(reflect.SliceOf(baseType), refValue.Len(), refValue.Cap()) + if refValue.Len() == 0 { value.Set(conv) return nil } diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index e71adca2..1b3bdcfc 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -198,6 +198,49 @@ func TestUnmarshalIntWithDefault(t *testing.T) { assert.Equal(t, 1, in.Int) } +func TestUnmarshalBoolSliceRequired(t *testing.T) { + type inner struct { + Bools []bool `key:"bools"` + } + + var in inner + assert.NotNil(t, UnmarshalKey(map[string]interface{}{}, &in)) +} + +func TestUnmarshalBoolSliceNil(t *testing.T) { + type inner struct { + Bools []bool `key:"bools,optional"` + } + + var in inner + assert.Nil(t, UnmarshalKey(map[string]interface{}{}, &in)) + assert.Nil(t, in.Bools) +} + +func TestUnmarshalBoolSliceNilExplicit(t *testing.T) { + type inner struct { + Bools []bool `key:"bools,optional"` + } + + var in inner + assert.Nil(t, UnmarshalKey(map[string]interface{}{ + "bools": nil, + }, &in)) + assert.Nil(t, in.Bools) +} + +func TestUnmarshalBoolSliceEmpty(t *testing.T) { + type inner struct { + Bools []bool `key:"bools,optional"` + } + + var in inner + assert.Nil(t, UnmarshalKey(map[string]interface{}{ + "bools": []bool{}, + }, &in)) + assert.Empty(t, in.Bools) +} + func TestUnmarshalBoolSliceWithDefault(t *testing.T) { type inner struct { Bools []bool `key:"bools,default=[true,false]"`