@@ -248,26 +248,14 @@ func unmarshalNode(data *Node, model reflect.Value, included *map[string]*Node)
248248
249249 structField := fieldType
250250
251- if structField .Type .Kind () != reflect .Struct ||
252- fieldValue .Type () == reflect .TypeOf (new (time.Time )) ||
253- fieldValue .Type () == reflect .TypeOf (time.Time {}) {
254- value , err := unmarshalAttribute (attribute , args , structField , fieldValue )
255- if err != nil {
256- er = err
257- break
258- }
259- assign (fieldValue , value )
260- continue
261-
262- } else {
263- structModel , err := unmarshalFromAttribute (attribute , fieldValue )
264- if err != nil {
265- er = err
266- break
267- }
268- fieldValue .Set ((* structModel ).Elem ())
269- continue
251+ value , err := unmarshalAttribute (attribute , args , structField , fieldValue )
252+ if err != nil {
253+ er = err
254+ break
270255 }
256+
257+ assign (fieldValue , value )
258+ continue
271259 } else if annotation == annotationRelation {
272260 isSlice := fieldValue .Type ().Kind () == reflect .Slice
273261
@@ -346,21 +334,22 @@ func unmarshalNode(data *Node, model reflect.Value, included *map[string]*Node)
346334 return er
347335}
348336
349- func unmarshalFromAttribute (attribute interface {}, fieldValue reflect.Value ) (* reflect.Value , error ) {
337+ func unmarshalFromAttribute (attribute interface {}, fieldValue reflect.Value ) (reflect.Value , error ) {
350338 structData , err := json .Marshal (attribute )
351339 if err != nil {
352- return nil , err
340+ return reflect. Value {} , err
353341 }
354342 structNode := new (Node )
355343 if err := json .Unmarshal (structData , & structNode .Attributes ); err != nil {
356- return nil , err
344+ return reflect. Value {} , err
357345 }
346+
358347 structModel := reflect .New (fieldValue .Type ())
359348 if err := unmarshalNode (structNode , structModel , nil ); err != nil {
360- return nil , err
349+ return reflect. Value {} , err
361350 }
362351
363- return & structModel , nil
352+ return structModel , nil
364353}
365354
366355func fullNode (n * Node , included * map [string ]* Node ) * Node {
@@ -376,7 +365,7 @@ func fullNode(n *Node, included *map[string]*Node) *Node {
376365// assign will take the value specified and assign it to the field; if
377366// field is expecting a ptr assign will assign a ptr.
378367func assign (field , value reflect.Value ) {
379- if field .Kind () == reflect .Ptr || field . Kind () == reflect . Struct {
368+ if field .Kind () == reflect .Ptr {
380369 field .Set (value )
381370 } else {
382371 field .Set (reflect .Indirect (value ))
@@ -402,12 +391,13 @@ func unmarshalAttribute(
402391 if fieldValue .Type () == reflect .TypeOf (time.Time {}) ||
403392 fieldValue .Type () == reflect .TypeOf (new (time.Time )) {
404393 value , err = handleTime (attribute , args , fieldValue )
394+
405395 return
406396 }
407397
408398 // Handle field of type struct
409- if fieldValue .Type (). Kind () == reflect .Struct {
410- value , err = handleStruct (attribute , fieldValue )
399+ if fieldValue .Kind () == reflect .Struct {
400+ value , err = unmarshalFromAttribute (attribute , fieldValue )
411401 return
412402 }
413403
@@ -426,7 +416,7 @@ func unmarshalAttribute(
426416
427417 // Field was a Pointer type
428418 if fieldValue .Kind () == reflect .Ptr {
429- value , err = handlePointer (attribute , args , fieldType , fieldValue , structField )
419+ value , err = handlePointer (attribute , fieldType , fieldValue , structField )
430420 return
431421 }
432422
@@ -482,7 +472,6 @@ func handleTime(attribute interface{}, args []string, fieldValue reflect.Value)
482472 }
483473
484474 var at int64
485-
486475 if v .Kind () == reflect .Float64 {
487476 at = int64 (v .Interface ().(float64 ))
488477 } else if v .Kind () == reflect .Int {
@@ -492,7 +481,6 @@ func handleTime(attribute interface{}, args []string, fieldValue reflect.Value)
492481 }
493482
494483 t := time .Unix (at , 0 )
495-
496484 return reflect .ValueOf (t ), nil
497485}
498486
@@ -558,7 +546,6 @@ func handleNumeric(
558546
559547func handlePointer (
560548 attribute interface {},
561- args []string ,
562549 fieldType reflect.Type ,
563550 fieldValue reflect.Value ,
564551 structField reflect.StructField ) (reflect.Value , error ) {
@@ -574,12 +561,15 @@ func handlePointer(
574561 concreteVal = reflect .ValueOf (& cVal )
575562 case map [string ]interface {}:
576563 var err error
577- concreteVal , err = handleStruct (attribute , fieldValue )
564+ fieldValueType := reflect .New (fieldValue .Type ().Elem ()).Elem ()
565+ concreteVal , err = unmarshalFromAttribute (attribute , fieldValueType )
578566 if err != nil {
579567 return reflect.Value {}, newErrUnsupportedPtrType (
580568 reflect .ValueOf (attribute ), fieldType , structField )
581569 }
570+
582571 return concreteVal , err
572+
583573 default :
584574 return reflect.Value {}, newErrUnsupportedPtrType (
585575 reflect .ValueOf (attribute ), fieldType , structField )
@@ -624,13 +614,13 @@ func handleStruct(
624614func handleStructSlice (
625615 attribute interface {},
626616 fieldValue reflect.Value ) (reflect.Value , error ) {
617+
627618 models := reflect .New (fieldValue .Type ()).Elem ()
628619 dataMap := reflect .ValueOf (attribute ).Interface ().([]interface {})
629620 for _ , data := range dataMap {
630621 model := reflect .New (fieldValue .Type ().Elem ()).Elem ()
631622
632- value , err := handleStruct (data , model )
633-
623+ value , err := unmarshalFromAttribute (data , model )
634624 if err != nil {
635625 continue
636626 }
0 commit comments