fixes issue with slice of nil pointers (#144)

fixes panic in case of marshaling of slice of nils like `[]*<SomeType>{nil, nil}`
This commit is contained in:
Ilya Baturin 2018-06-18 05:19:26 +03:00 committed by Aren Patel
parent 2dcc18f436
commit 5d047c6bc6
2 changed files with 36 additions and 2 deletions

View File

@ -207,9 +207,13 @@ func visitModelNode(model interface{}, included *map[string]*Node,
node := new(Node) node := new(Node)
var er error var er error
value := reflect.ValueOf(model)
if value.IsNil() {
return nil, nil
}
modelValue := reflect.ValueOf(model).Elem() modelValue := value.Elem()
modelType := reflect.ValueOf(model).Type().Elem() modelType := value.Type().Elem()
for i := 0; i < modelValue.NumField(); i++ { for i := 0; i < modelValue.NumField(); i++ {
structField := modelValue.Type().Field(i) structField := modelValue.Type().Field(i)

View File

@ -37,6 +37,36 @@ func TestMarshalPayload(t *testing.T) {
} }
} }
func TestMarshalPayloadWithNulls(t *testing.T) {
books := []*Book{nil, {ID:101}, nil}
var jsonData map[string]interface{}
out := bytes.NewBuffer(nil)
if err := MarshalPayload(out, books); err != nil {
t.Fatal(err)
}
if err := json.Unmarshal(out.Bytes(), &jsonData); err != nil {
t.Fatal(err)
}
raw, ok := jsonData["data"]
if !ok {
t.Fatalf("data key does not exist")
}
arr, ok := raw.([]interface{})
if !ok {
t.Fatalf("data is not an Array")
}
for i := 0; i < len(arr); i++ {
if books[i] == nil && arr[i] != nil ||
books[i] != nil && arr[i] == nil {
t.Fatalf("restored data is not equal to source")
}
}
}
func TestMarshal_attrStringSlice(t *testing.T) { func TestMarshal_attrStringSlice(t *testing.T) {
tags := []string{"fiction", "sale"} tags := []string{"fiction", "sale"}
b := &Book{ID: 1, Tags: tags} b := &Book{ID: 1, Tags: tags}