@@ -42,7 +42,7 @@ func MarshalOnePayload(w io.Writer, model interface{}) error {
42
42
func MarshalOne (model interface {}) (* OnePayload , error ) {
43
43
included := make (map [string ]* Node )
44
44
45
- rootNode , err := visitModelNode (model , & included , true )
45
+ rootNode , err := visitModelNode (reflect . ValueOf ( model ) , & included , true )
46
46
if err != nil {
47
47
return nil , err
48
48
}
@@ -99,7 +99,7 @@ func MarshalMany(models []interface{}) (*ManyPayload, error) {
99
99
for i := 0 ; i < len (models ); i ++ {
100
100
model := models [i ]
101
101
102
- node , err := visitModelNode (model , & included , true )
102
+ node , err := visitModelNode (reflect . ValueOf ( model ) , & included , true )
103
103
if err != nil {
104
104
return nil , err
105
105
}
@@ -131,7 +131,7 @@ func MarshalMany(models []interface{}) (*ManyPayload, error) {
131
131
//
132
132
// model interface{} should be a pointer to a struct.
133
133
func MarshalOnePayloadEmbedded (w io.Writer , model interface {}) error {
134
- rootNode , err := visitModelNode (model , nil , false )
134
+ rootNode , err := visitModelNode (reflect . ValueOf ( model ) , nil , false )
135
135
if err != nil {
136
136
return err
137
137
}
@@ -145,15 +145,28 @@ func MarshalOnePayloadEmbedded(w io.Writer, model interface{}) error {
145
145
return nil
146
146
}
147
147
148
- func visitModelNode (model interface {} , included * map [string ]* Node , sideload bool ) (* Node , error ) {
148
+ func visitModelNode (model reflect. Value , included * map [string ]* Node , sideload bool ) (* Node , error ) {
149
149
node := new (Node )
150
150
151
151
var er error
152
152
153
- modelValue := reflect . ValueOf ( model ) .Elem ()
153
+ modelValue := model .Elem ()
154
154
155
155
for i := 0 ; i < modelValue .NumField (); i ++ {
156
156
structField := modelValue .Type ().Field (i )
157
+
158
+ if structField .Anonymous {
159
+ if modelValue .Field (i ).IsNil () {
160
+ continue
161
+ }
162
+ if n , err := visitModelNode (modelValue .Field (i ), included , sideload ); err == nil {
163
+ node .Extend (n )
164
+ } else {
165
+ err = err
166
+ break
167
+ }
168
+ }
169
+
157
170
tag := structField .Tag .Get ("jsonapi" )
158
171
if tag == "" {
159
172
continue
@@ -252,10 +265,6 @@ func visitModelNode(model interface{}, included *map[string]*Node, sideload bool
252
265
continue
253
266
}
254
267
255
- if node .Relationships == nil {
256
- node .Relationships = make (map [string ]interface {})
257
- }
258
-
259
268
if isSlice {
260
269
relationship , err := visitModelNodeRelationships (args [1 ], fieldValue , included , sideload )
261
270
@@ -269,22 +278,22 @@ func visitModelNode(model interface{}, included *map[string]*Node, sideload bool
269
278
shallowNodes = append (shallowNodes , toShallowNode (n ))
270
279
}
271
280
272
- node .Relationships [ args [1 ]] = & RelationshipManyNode {Data : shallowNodes }
281
+ node .AddRelationship ( args [1 ], & RelationshipManyNode {Data : shallowNodes })
273
282
} else {
274
- node .Relationships [ args [1 ]] = relationship
283
+ node .AddRelationship ( args [1 ], relationship )
275
284
}
276
285
} else {
277
286
er = err
278
287
break
279
288
}
280
289
} else {
281
- relationship , err := visitModelNode (fieldValue . Interface () , included , sideload )
290
+ relationship , err := visitModelNode (fieldValue , included , sideload )
282
291
if err == nil {
283
292
if sideload {
284
293
appendIncluded (included , relationship )
285
- node .Relationships [ args [1 ]] = & RelationshipOneNode {Data : toShallowNode (relationship )}
294
+ node .AddRelationship ( args [1 ], & RelationshipOneNode {Data : toShallowNode (relationship )})
286
295
} else {
287
- node .Relationships [ args [1 ]] = & RelationshipOneNode {Data : relationship }
296
+ node .AddRelationship ( args [1 ], & RelationshipOneNode {Data : relationship })
288
297
}
289
298
} else {
290
299
er = err
@@ -321,7 +330,7 @@ func visitModelNodeRelationships(relationName string, models reflect.Value, incl
321
330
322
331
for i := 0 ; i < models .Len (); i ++ {
323
332
n := models .Index (i ).Interface ()
324
- node , err := visitModelNode (n , included , sideload )
333
+ node , err := visitModelNode (reflect . ValueOf ( n ) , included , sideload )
325
334
if err != nil {
326
335
return nil , err
327
336
}
0 commit comments