Skip to content

Commit 5d047c6

Browse files
ejilayaren55555
authored andcommitted
fixes issue with slice of nil pointers (#144)
fixes panic in case of marshaling of slice of nils like `[]*<SomeType>{nil, nil}`
1 parent 2dcc18f commit 5d047c6

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

response.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,13 @@ func visitModelNode(model interface{}, included *map[string]*Node,
207207
node := new(Node)
208208

209209
var er error
210+
value := reflect.ValueOf(model)
211+
if value.IsNil() {
212+
return nil, nil
213+
}
210214

211-
modelValue := reflect.ValueOf(model).Elem()
212-
modelType := reflect.ValueOf(model).Type().Elem()
215+
modelValue := value.Elem()
216+
modelType := value.Type().Elem()
213217

214218
for i := 0; i < modelValue.NumField(); i++ {
215219
structField := modelValue.Type().Field(i)

response_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,36 @@ func TestMarshalPayload(t *testing.T) {
3737
}
3838
}
3939

40+
func TestMarshalPayloadWithNulls(t *testing.T) {
41+
42+
books := []*Book{nil, {ID:101}, nil}
43+
var jsonData map[string]interface{}
44+
45+
46+
out := bytes.NewBuffer(nil)
47+
if err := MarshalPayload(out, books); err != nil {
48+
t.Fatal(err)
49+
}
50+
51+
if err := json.Unmarshal(out.Bytes(), &jsonData); err != nil {
52+
t.Fatal(err)
53+
}
54+
raw, ok := jsonData["data"]
55+
if !ok {
56+
t.Fatalf("data key does not exist")
57+
}
58+
arr, ok := raw.([]interface{})
59+
if !ok {
60+
t.Fatalf("data is not an Array")
61+
}
62+
for i := 0; i < len(arr); i++ {
63+
if books[i] == nil && arr[i] != nil ||
64+
books[i] != nil && arr[i] == nil {
65+
t.Fatalf("restored data is not equal to source")
66+
}
67+
}
68+
}
69+
4070
func TestMarshal_attrStringSlice(t *testing.T) {
4171
tags := []string{"fiction", "sale"}
4272
b := &Book{ID: 1, Tags: tags}

0 commit comments

Comments
 (0)