@@ -13,7 +13,7 @@ import (
13
13
)
14
14
15
15
const (
16
- unsuportedStructTagMsg = "Unsupported jsonapi tag annotation, %s"
16
+ unsupportedStructTagMsg = "Unsupported jsonapi tag annotation, %s"
17
17
)
18
18
19
19
var (
@@ -147,7 +147,7 @@ func unmarshalNode(data *Node, model reflect.Value, included *map[string]*Node)
147
147
}()
148
148
149
149
modelValue := model .Elem ()
150
- modelType := model .Type (). Elem ()
150
+ modelType := modelValue .Type ()
151
151
152
152
var er error
153
153
@@ -217,39 +217,8 @@ func unmarshalNode(data *Node, model reflect.Value, included *map[string]*Node)
217
217
218
218
// Convert the numeric float to one of the supported ID numeric types
219
219
// (int[8,16,32,64] or uint[8,16,32,64])
220
- var idValue reflect.Value
221
- switch kind {
222
- case reflect .Int :
223
- n := int (floatValue )
224
- idValue = reflect .ValueOf (& n )
225
- case reflect .Int8 :
226
- n := int8 (floatValue )
227
- idValue = reflect .ValueOf (& n )
228
- case reflect .Int16 :
229
- n := int16 (floatValue )
230
- idValue = reflect .ValueOf (& n )
231
- case reflect .Int32 :
232
- n := int32 (floatValue )
233
- idValue = reflect .ValueOf (& n )
234
- case reflect .Int64 :
235
- n := int64 (floatValue )
236
- idValue = reflect .ValueOf (& n )
237
- case reflect .Uint :
238
- n := uint (floatValue )
239
- idValue = reflect .ValueOf (& n )
240
- case reflect .Uint8 :
241
- n := uint8 (floatValue )
242
- idValue = reflect .ValueOf (& n )
243
- case reflect .Uint16 :
244
- n := uint16 (floatValue )
245
- idValue = reflect .ValueOf (& n )
246
- case reflect .Uint32 :
247
- n := uint32 (floatValue )
248
- idValue = reflect .ValueOf (& n )
249
- case reflect .Uint64 :
250
- n := uint64 (floatValue )
251
- idValue = reflect .ValueOf (& n )
252
- default :
220
+ idValue , err := handleNumeric (floatValue , fieldType .Type , fieldValue )
221
+ if err != nil {
253
222
// We had a JSON float (numeric), but our field was not one of the
254
223
// allowed numeric types
255
224
er = ErrBadJSONAPIID
@@ -358,7 +327,7 @@ func unmarshalNode(data *Node, model reflect.Value, included *map[string]*Node)
358
327
}
359
328
360
329
} else {
361
- er = fmt .Errorf (unsuportedStructTagMsg , annotation )
330
+ er = fmt .Errorf (unsupportedStructTagMsg , annotation )
362
331
}
363
332
}
364
333
@@ -395,33 +364,33 @@ func unmarshalAttribute(
395
364
396
365
// Handle field of type []string
397
366
if fieldValue .Type () == reflect .TypeOf ([]string {}) {
398
- value , err = handleStringSlice (attribute , args , fieldType , fieldValue )
367
+ value , err = handleStringSlice (attribute )
399
368
return
400
369
}
401
370
402
371
// Handle field of type time.Time
403
372
if fieldValue .Type () == reflect .TypeOf (time.Time {}) ||
404
373
fieldValue .Type () == reflect .TypeOf (new (time.Time )) {
405
- value , err = handleTime (attribute , args , fieldType , fieldValue )
374
+ value , err = handleTime (attribute , args , fieldValue )
406
375
return
407
376
}
408
377
409
378
// Handle field of type struct
410
379
if fieldValue .Type ().Kind () == reflect .Struct {
411
- value , err = handleStruct (attribute , args , fieldType , fieldValue )
380
+ value , err = handleStruct (attribute , fieldValue )
412
381
return
413
382
}
414
383
415
384
// Handle field containing slice of structs
416
385
if fieldValue .Type ().Kind () == reflect .Slice &&
417
386
reflect .TypeOf (fieldValue .Interface ()).Elem ().Kind () == reflect .Struct {
418
- value , err = handleStructSlice (attribute , args , fieldType , fieldValue )
387
+ value , err = handleStructSlice (attribute , fieldValue )
419
388
return
420
389
}
421
390
422
391
// JSON value was a float (numeric)
423
392
if value .Kind () == reflect .Float64 {
424
- value , err = handleNumeric (attribute , args , fieldType , fieldValue )
393
+ value , err = handleNumeric (attribute , fieldType , fieldValue )
425
394
return
426
395
}
427
396
@@ -440,11 +409,7 @@ func unmarshalAttribute(
440
409
return
441
410
}
442
411
443
- func handleStringSlice (
444
- attribute interface {},
445
- args []string ,
446
- fieldType reflect.Type ,
447
- fieldValue reflect.Value ) (reflect.Value , error ) {
412
+ func handleStringSlice (attribute interface {}) (reflect.Value , error ) {
448
413
v := reflect .ValueOf (attribute )
449
414
values := make ([]string , v .Len ())
450
415
for i := 0 ; i < v .Len (); i ++ {
@@ -454,11 +419,7 @@ func handleStringSlice(
454
419
return reflect .ValueOf (values ), nil
455
420
}
456
421
457
- func handleTime (
458
- attribute interface {},
459
- args []string ,
460
- fieldType reflect.Type ,
461
- fieldValue reflect.Value ) (reflect.Value , error ) {
422
+ func handleTime (attribute interface {}, args []string , fieldValue reflect.Value ) (reflect.Value , error ) {
462
423
var isIso8601 bool
463
424
v := reflect .ValueOf (attribute )
464
425
@@ -507,7 +468,6 @@ func handleTime(
507
468
508
469
func handleNumeric (
509
470
attribute interface {},
510
- args []string ,
511
471
fieldType reflect.Type ,
512
472
fieldValue reflect.Value ) (reflect.Value , error ) {
513
473
v := reflect .ValueOf (attribute )
@@ -584,12 +544,12 @@ func handlePointer(
584
544
concreteVal = reflect .ValueOf (& cVal )
585
545
case map [string ]interface {}:
586
546
var err error
587
- concreteVal , err = handleStruct (attribute , args , fieldType , fieldValue )
547
+ concreteVal , err = handleStruct (attribute , fieldValue )
588
548
if err != nil {
589
549
return reflect.Value {}, newErrUnsupportedPtrType (
590
550
reflect .ValueOf (attribute ), fieldType , structField )
591
551
}
592
- return concreteVal . Elem () , err
552
+ return concreteVal , err
593
553
default :
594
554
return reflect.Value {}, newErrUnsupportedPtrType (
595
555
reflect .ValueOf (attribute ), fieldType , structField )
@@ -605,37 +565,42 @@ func handlePointer(
605
565
606
566
func handleStruct (
607
567
attribute interface {},
608
- args []string ,
609
- fieldType reflect.Type ,
610
568
fieldValue reflect.Value ) (reflect.Value , error ) {
611
- model := reflect .New (fieldValue .Type ())
612
569
613
570
data , err := json .Marshal (attribute )
614
571
if err != nil {
615
- return model , err
572
+ return reflect. Value {} , err
616
573
}
617
574
618
- err = json .Unmarshal (data , model .Interface ())
575
+ node := new (Node )
576
+ if err := json .Unmarshal (data , & node .Attributes ); err != nil {
577
+ return reflect.Value {}, err
578
+ }
619
579
620
- if err != nil {
621
- return model , err
580
+ var model reflect.Value
581
+ if fieldValue .Kind () == reflect .Ptr {
582
+ model = reflect .New (fieldValue .Type ().Elem ())
583
+ } else {
584
+ model = reflect .New (fieldValue .Type ())
622
585
}
623
586
624
- return model , err
587
+ if err := unmarshalNode (node , model , nil ); err != nil {
588
+ return reflect.Value {}, err
589
+ }
590
+
591
+
592
+ return model , nil
625
593
}
626
594
627
595
func handleStructSlice (
628
596
attribute interface {},
629
- args []string ,
630
- fieldType reflect.Type ,
631
597
fieldValue reflect.Value ) (reflect.Value , error ) {
632
598
models := reflect .New (fieldValue .Type ()).Elem ()
633
599
dataMap := reflect .ValueOf (attribute ).Interface ().([]interface {})
634
600
for _ , data := range dataMap {
635
601
model := reflect .New (fieldValue .Type ().Elem ()).Elem ()
636
- modelType := model .Type ()
637
602
638
- value , err := handleStruct (data , [] string {}, modelType , model )
603
+ value , err := handleStruct (data , model )
639
604
640
605
if err != nil {
641
606
continue
0 commit comments