1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 package mapstructure
160
161 import (
162 "encoding/json"
163 "errors"
164 "fmt"
165 "reflect"
166 "sort"
167 "strconv"
168 "strings"
169 )
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 type DecodeHookFunc interface{}
186
187
188
189 type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface{}, error)
190
191
192
193 type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error)
194
195
196
197 type DecodeHookFuncValue func(from reflect.Value, to reflect.Value) (interface{}, error)
198
199
200
201 type DecoderConfig struct {
202
203
204
205
206
207
208
209
210
211 DecodeHook DecodeHookFunc
212
213
214
215
216 ErrorUnused bool
217
218
219
220
221
222 ErrorUnset bool
223
224
225
226
227 ZeroFields bool
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246 WeaklyTypedInput bool
247
248
249
250
251
252
253
254 Squash bool
255
256
257
258 Metadata *Metadata
259
260
261
262 Result interface{}
263
264
265
266 TagName string
267
268
269
270 IgnoreUntaggedFields bool
271
272
273
274
275 MatchName func(mapKey, fieldName string) bool
276 }
277
278
279
280
281
282
283
284 type Decoder struct {
285 config *DecoderConfig
286 }
287
288
289
290 type Metadata struct {
291
292 Keys []string
293
294
295
296 Unused []string
297
298
299
300
301 Unset []string
302 }
303
304
305
306 func Decode(input interface{}, output interface{}) error {
307 config := &DecoderConfig{
308 Metadata: nil,
309 Result: output,
310 }
311
312 decoder, err := NewDecoder(config)
313 if err != nil {
314 return err
315 }
316
317 return decoder.Decode(input)
318 }
319
320
321
322 func WeakDecode(input, output interface{}) error {
323 config := &DecoderConfig{
324 Metadata: nil,
325 Result: output,
326 WeaklyTypedInput: true,
327 }
328
329 decoder, err := NewDecoder(config)
330 if err != nil {
331 return err
332 }
333
334 return decoder.Decode(input)
335 }
336
337
338
339 func DecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error {
340 config := &DecoderConfig{
341 Metadata: metadata,
342 Result: output,
343 }
344
345 decoder, err := NewDecoder(config)
346 if err != nil {
347 return err
348 }
349
350 return decoder.Decode(input)
351 }
352
353
354
355
356 func WeakDecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error {
357 config := &DecoderConfig{
358 Metadata: metadata,
359 Result: output,
360 WeaklyTypedInput: true,
361 }
362
363 decoder, err := NewDecoder(config)
364 if err != nil {
365 return err
366 }
367
368 return decoder.Decode(input)
369 }
370
371
372
373
374 func NewDecoder(config *DecoderConfig) (*Decoder, error) {
375 val := reflect.ValueOf(config.Result)
376 if val.Kind() != reflect.Ptr {
377 return nil, errors.New("result must be a pointer")
378 }
379
380 val = val.Elem()
381 if !val.CanAddr() {
382 return nil, errors.New("result must be addressable (a pointer)")
383 }
384
385 if config.Metadata != nil {
386 if config.Metadata.Keys == nil {
387 config.Metadata.Keys = make([]string, 0)
388 }
389
390 if config.Metadata.Unused == nil {
391 config.Metadata.Unused = make([]string, 0)
392 }
393
394 if config.Metadata.Unset == nil {
395 config.Metadata.Unset = make([]string, 0)
396 }
397 }
398
399 if config.TagName == "" {
400 config.TagName = "mapstructure"
401 }
402
403 if config.MatchName == nil {
404 config.MatchName = strings.EqualFold
405 }
406
407 result := &Decoder{
408 config: config,
409 }
410
411 return result, nil
412 }
413
414
415
416 func (d *Decoder) Decode(input interface{}) error {
417 return d.decode("", input, reflect.ValueOf(d.config.Result).Elem())
418 }
419
420
421 func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) error {
422 var inputVal reflect.Value
423 if input != nil {
424 inputVal = reflect.ValueOf(input)
425
426
427
428 if inputVal.Kind() == reflect.Ptr && inputVal.IsNil() {
429 input = nil
430 }
431 }
432
433 if input == nil {
434
435
436 if d.config.ZeroFields {
437 outVal.Set(reflect.Zero(outVal.Type()))
438
439 if d.config.Metadata != nil && name != "" {
440 d.config.Metadata.Keys = append(d.config.Metadata.Keys, name)
441 }
442 }
443 return nil
444 }
445
446 if !inputVal.IsValid() {
447
448
449 outVal.Set(reflect.Zero(outVal.Type()))
450 if d.config.Metadata != nil && name != "" {
451 d.config.Metadata.Keys = append(d.config.Metadata.Keys, name)
452 }
453 return nil
454 }
455
456 if d.config.DecodeHook != nil {
457
458 var err error
459 input, err = DecodeHookExec(d.config.DecodeHook, inputVal, outVal)
460 if err != nil {
461 return fmt.Errorf("error decoding '%s': %s", name, err)
462 }
463 }
464
465 var err error
466 outputKind := getKind(outVal)
467 addMetaKey := true
468 switch outputKind {
469 case reflect.Bool:
470 err = d.decodeBool(name, input, outVal)
471 case reflect.Interface:
472 err = d.decodeBasic(name, input, outVal)
473 case reflect.String:
474 err = d.decodeString(name, input, outVal)
475 case reflect.Int:
476 err = d.decodeInt(name, input, outVal)
477 case reflect.Uint:
478 err = d.decodeUint(name, input, outVal)
479 case reflect.Float32:
480 err = d.decodeFloat(name, input, outVal)
481 case reflect.Struct:
482 err = d.decodeStruct(name, input, outVal)
483 case reflect.Map:
484 err = d.decodeMap(name, input, outVal)
485 case reflect.Ptr:
486 addMetaKey, err = d.decodePtr(name, input, outVal)
487 case reflect.Slice:
488 err = d.decodeSlice(name, input, outVal)
489 case reflect.Array:
490 err = d.decodeArray(name, input, outVal)
491 case reflect.Func:
492 err = d.decodeFunc(name, input, outVal)
493 default:
494
495 return fmt.Errorf("%s: unsupported type: %s", name, outputKind)
496 }
497
498
499
500 if addMetaKey && d.config.Metadata != nil && name != "" {
501 d.config.Metadata.Keys = append(d.config.Metadata.Keys, name)
502 }
503
504 return err
505 }
506
507
508
509 func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error {
510 if val.IsValid() && val.Elem().IsValid() {
511 elem := val.Elem()
512
513
514
515
516 copied := false
517 if !elem.CanAddr() {
518 copied = true
519
520
521 copy := reflect.New(elem.Type())
522
523
524 copy.Elem().Set(elem)
525
526
527 elem = copy
528 }
529
530
531
532 if err := d.decode(name, data, elem); err != nil || !copied {
533 return err
534 }
535
536
537 val.Set(elem.Elem())
538 return nil
539 }
540
541 dataVal := reflect.ValueOf(data)
542
543
544
545
546 if dataVal.Kind() == reflect.Ptr && dataVal.Type().Elem() == val.Type() {
547 dataVal = reflect.Indirect(dataVal)
548 }
549
550 if !dataVal.IsValid() {
551 dataVal = reflect.Zero(val.Type())
552 }
553
554 dataValType := dataVal.Type()
555 if !dataValType.AssignableTo(val.Type()) {
556 return fmt.Errorf(
557 "'%s' expected type '%s', got '%s'",
558 name, val.Type(), dataValType)
559 }
560
561 val.Set(dataVal)
562 return nil
563 }
564
565 func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) error {
566 dataVal := reflect.Indirect(reflect.ValueOf(data))
567 dataKind := getKind(dataVal)
568
569 converted := true
570 switch {
571 case dataKind == reflect.String:
572 val.SetString(dataVal.String())
573 case dataKind == reflect.Bool && d.config.WeaklyTypedInput:
574 if dataVal.Bool() {
575 val.SetString("1")
576 } else {
577 val.SetString("0")
578 }
579 case dataKind == reflect.Int && d.config.WeaklyTypedInput:
580 val.SetString(strconv.FormatInt(dataVal.Int(), 10))
581 case dataKind == reflect.Uint && d.config.WeaklyTypedInput:
582 val.SetString(strconv.FormatUint(dataVal.Uint(), 10))
583 case dataKind == reflect.Float32 && d.config.WeaklyTypedInput:
584 val.SetString(strconv.FormatFloat(dataVal.Float(), 'f', -1, 64))
585 case dataKind == reflect.Slice && d.config.WeaklyTypedInput,
586 dataKind == reflect.Array && d.config.WeaklyTypedInput:
587 dataType := dataVal.Type()
588 elemKind := dataType.Elem().Kind()
589 switch elemKind {
590 case reflect.Uint8:
591 var uints []uint8
592 if dataKind == reflect.Array {
593 uints = make([]uint8, dataVal.Len(), dataVal.Len())
594 for i := range uints {
595 uints[i] = dataVal.Index(i).Interface().(uint8)
596 }
597 } else {
598 uints = dataVal.Interface().([]uint8)
599 }
600 val.SetString(string(uints))
601 default:
602 converted = false
603 }
604 default:
605 converted = false
606 }
607
608 if !converted {
609 return fmt.Errorf(
610 "'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
611 name, val.Type(), dataVal.Type(), data)
612 }
613
614 return nil
615 }
616
617 func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) error {
618 dataVal := reflect.Indirect(reflect.ValueOf(data))
619 dataKind := getKind(dataVal)
620 dataType := dataVal.Type()
621
622 switch {
623 case dataKind == reflect.Int:
624 val.SetInt(dataVal.Int())
625 case dataKind == reflect.Uint:
626 val.SetInt(int64(dataVal.Uint()))
627 case dataKind == reflect.Float32:
628 val.SetInt(int64(dataVal.Float()))
629 case dataKind == reflect.Bool && d.config.WeaklyTypedInput:
630 if dataVal.Bool() {
631 val.SetInt(1)
632 } else {
633 val.SetInt(0)
634 }
635 case dataKind == reflect.String && d.config.WeaklyTypedInput:
636 str := dataVal.String()
637 if str == "" {
638 str = "0"
639 }
640
641 i, err := strconv.ParseInt(str, 0, val.Type().Bits())
642 if err == nil {
643 val.SetInt(i)
644 } else {
645 return fmt.Errorf("cannot parse '%s' as int: %s", name, err)
646 }
647 case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number":
648 jn := data.(json.Number)
649 i, err := jn.Int64()
650 if err != nil {
651 return fmt.Errorf(
652 "error decoding json.Number into %s: %s", name, err)
653 }
654 val.SetInt(i)
655 default:
656 return fmt.Errorf(
657 "'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
658 name, val.Type(), dataVal.Type(), data)
659 }
660
661 return nil
662 }
663
664 func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error {
665 dataVal := reflect.Indirect(reflect.ValueOf(data))
666 dataKind := getKind(dataVal)
667 dataType := dataVal.Type()
668
669 switch {
670 case dataKind == reflect.Int:
671 i := dataVal.Int()
672 if i < 0 && !d.config.WeaklyTypedInput {
673 return fmt.Errorf("cannot parse '%s', %d overflows uint",
674 name, i)
675 }
676 val.SetUint(uint64(i))
677 case dataKind == reflect.Uint:
678 val.SetUint(dataVal.Uint())
679 case dataKind == reflect.Float32:
680 f := dataVal.Float()
681 if f < 0 && !d.config.WeaklyTypedInput {
682 return fmt.Errorf("cannot parse '%s', %f overflows uint",
683 name, f)
684 }
685 val.SetUint(uint64(f))
686 case dataKind == reflect.Bool && d.config.WeaklyTypedInput:
687 if dataVal.Bool() {
688 val.SetUint(1)
689 } else {
690 val.SetUint(0)
691 }
692 case dataKind == reflect.String && d.config.WeaklyTypedInput:
693 str := dataVal.String()
694 if str == "" {
695 str = "0"
696 }
697
698 i, err := strconv.ParseUint(str, 0, val.Type().Bits())
699 if err == nil {
700 val.SetUint(i)
701 } else {
702 return fmt.Errorf("cannot parse '%s' as uint: %s", name, err)
703 }
704 case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number":
705 jn := data.(json.Number)
706 i, err := strconv.ParseUint(string(jn), 0, 64)
707 if err != nil {
708 return fmt.Errorf(
709 "error decoding json.Number into %s: %s", name, err)
710 }
711 val.SetUint(i)
712 default:
713 return fmt.Errorf(
714 "'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
715 name, val.Type(), dataVal.Type(), data)
716 }
717
718 return nil
719 }
720
721 func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) error {
722 dataVal := reflect.Indirect(reflect.ValueOf(data))
723 dataKind := getKind(dataVal)
724
725 switch {
726 case dataKind == reflect.Bool:
727 val.SetBool(dataVal.Bool())
728 case dataKind == reflect.Int && d.config.WeaklyTypedInput:
729 val.SetBool(dataVal.Int() != 0)
730 case dataKind == reflect.Uint && d.config.WeaklyTypedInput:
731 val.SetBool(dataVal.Uint() != 0)
732 case dataKind == reflect.Float32 && d.config.WeaklyTypedInput:
733 val.SetBool(dataVal.Float() != 0)
734 case dataKind == reflect.String && d.config.WeaklyTypedInput:
735 b, err := strconv.ParseBool(dataVal.String())
736 if err == nil {
737 val.SetBool(b)
738 } else if dataVal.String() == "" {
739 val.SetBool(false)
740 } else {
741 return fmt.Errorf("cannot parse '%s' as bool: %s", name, err)
742 }
743 default:
744 return fmt.Errorf(
745 "'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
746 name, val.Type(), dataVal.Type(), data)
747 }
748
749 return nil
750 }
751
752 func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) error {
753 dataVal := reflect.Indirect(reflect.ValueOf(data))
754 dataKind := getKind(dataVal)
755 dataType := dataVal.Type()
756
757 switch {
758 case dataKind == reflect.Int:
759 val.SetFloat(float64(dataVal.Int()))
760 case dataKind == reflect.Uint:
761 val.SetFloat(float64(dataVal.Uint()))
762 case dataKind == reflect.Float32:
763 val.SetFloat(dataVal.Float())
764 case dataKind == reflect.Bool && d.config.WeaklyTypedInput:
765 if dataVal.Bool() {
766 val.SetFloat(1)
767 } else {
768 val.SetFloat(0)
769 }
770 case dataKind == reflect.String && d.config.WeaklyTypedInput:
771 str := dataVal.String()
772 if str == "" {
773 str = "0"
774 }
775
776 f, err := strconv.ParseFloat(str, val.Type().Bits())
777 if err == nil {
778 val.SetFloat(f)
779 } else {
780 return fmt.Errorf("cannot parse '%s' as float: %s", name, err)
781 }
782 case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number":
783 jn := data.(json.Number)
784 i, err := jn.Float64()
785 if err != nil {
786 return fmt.Errorf(
787 "error decoding json.Number into %s: %s", name, err)
788 }
789 val.SetFloat(i)
790 default:
791 return fmt.Errorf(
792 "'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
793 name, val.Type(), dataVal.Type(), data)
794 }
795
796 return nil
797 }
798
799 func (d *Decoder) decodeMap(name string, data interface{}, val reflect.Value) error {
800 valType := val.Type()
801 valKeyType := valType.Key()
802 valElemType := valType.Elem()
803
804
805 valMap := val
806
807
808 if valMap.IsNil() || d.config.ZeroFields {
809
810 mapType := reflect.MapOf(valKeyType, valElemType)
811 valMap = reflect.MakeMap(mapType)
812 }
813
814
815 dataVal := reflect.Indirect(reflect.ValueOf(data))
816 switch dataVal.Kind() {
817 case reflect.Map:
818 return d.decodeMapFromMap(name, dataVal, val, valMap)
819
820 case reflect.Struct:
821 return d.decodeMapFromStruct(name, dataVal, val, valMap)
822
823 case reflect.Array, reflect.Slice:
824 if d.config.WeaklyTypedInput {
825 return d.decodeMapFromSlice(name, dataVal, val, valMap)
826 }
827
828 fallthrough
829
830 default:
831 return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind())
832 }
833 }
834
835 func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error {
836
837 if dataVal.Len() == 0 {
838 val.Set(valMap)
839 return nil
840 }
841
842 for i := 0; i < dataVal.Len(); i++ {
843 err := d.decode(
844 name+"["+strconv.Itoa(i)+"]",
845 dataVal.Index(i).Interface(), val)
846 if err != nil {
847 return err
848 }
849 }
850
851 return nil
852 }
853
854 func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error {
855 valType := val.Type()
856 valKeyType := valType.Key()
857 valElemType := valType.Elem()
858
859
860 errors := make([]string, 0)
861
862
863 if dataVal.Len() == 0 {
864 if dataVal.IsNil() {
865 if !val.IsNil() {
866 val.Set(dataVal)
867 }
868 } else {
869
870 val.Set(valMap)
871 }
872
873 return nil
874 }
875
876 for _, k := range dataVal.MapKeys() {
877 fieldName := name + "[" + k.String() + "]"
878
879
880 currentKey := reflect.Indirect(reflect.New(valKeyType))
881 if err := d.decode(fieldName, k.Interface(), currentKey); err != nil {
882 errors = appendErrors(errors, err)
883 continue
884 }
885
886
887 v := dataVal.MapIndex(k).Interface()
888 currentVal := reflect.Indirect(reflect.New(valElemType))
889 if err := d.decode(fieldName, v, currentVal); err != nil {
890 errors = appendErrors(errors, err)
891 continue
892 }
893
894 valMap.SetMapIndex(currentKey, currentVal)
895 }
896
897
898 val.Set(valMap)
899
900
901 if len(errors) > 0 {
902 return &Error{errors}
903 }
904
905 return nil
906 }
907
908 func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error {
909 typ := dataVal.Type()
910 for i := 0; i < typ.NumField(); i++ {
911
912
913 f := typ.Field(i)
914 if f.PkgPath != "" {
915 continue
916 }
917
918
919
920 v := dataVal.Field(i)
921 if !v.Type().AssignableTo(valMap.Type().Elem()) {
922 return fmt.Errorf("cannot assign type '%s' to map value field of type '%s'", v.Type(), valMap.Type().Elem())
923 }
924
925 tagValue := f.Tag.Get(d.config.TagName)
926 keyName := f.Name
927
928 if tagValue == "" && d.config.IgnoreUntaggedFields {
929 continue
930 }
931
932
933 squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous
934
935 v = dereferencePtrToStructIfNeeded(v, d.config.TagName)
936
937
938 if index := strings.Index(tagValue, ","); index != -1 {
939 if tagValue[:index] == "-" {
940 continue
941 }
942
943 if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) {
944 continue
945 }
946
947
948 squash = squash || strings.Index(tagValue[index+1:], "squash") != -1
949 if squash {
950
951 if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct {
952 v = v.Elem()
953 }
954
955
956 if v.Kind() != reflect.Struct {
957 return fmt.Errorf("cannot squash non-struct type '%s'", v.Type())
958 }
959 }
960 if keyNameTagValue := tagValue[:index]; keyNameTagValue != "" {
961 keyName = keyNameTagValue
962 }
963 } else if len(tagValue) > 0 {
964 if tagValue == "-" {
965 continue
966 }
967 keyName = tagValue
968 }
969
970 switch v.Kind() {
971
972 case reflect.Struct:
973 x := reflect.New(v.Type())
974 x.Elem().Set(v)
975
976 vType := valMap.Type()
977 vKeyType := vType.Key()
978 vElemType := vType.Elem()
979 mType := reflect.MapOf(vKeyType, vElemType)
980 vMap := reflect.MakeMap(mType)
981
982
983
984
985
986 addrVal := reflect.New(vMap.Type())
987 reflect.Indirect(addrVal).Set(vMap)
988
989 err := d.decode(keyName, x.Interface(), reflect.Indirect(addrVal))
990 if err != nil {
991 return err
992 }
993
994
995
996 vMap = reflect.Indirect(addrVal)
997
998 if squash {
999 for _, k := range vMap.MapKeys() {
1000 valMap.SetMapIndex(k, vMap.MapIndex(k))
1001 }
1002 } else {
1003 valMap.SetMapIndex(reflect.ValueOf(keyName), vMap)
1004 }
1005
1006 default:
1007 valMap.SetMapIndex(reflect.ValueOf(keyName), v)
1008 }
1009 }
1010
1011 if val.CanAddr() {
1012 val.Set(valMap)
1013 }
1014
1015 return nil
1016 }
1017
1018 func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) {
1019
1020
1021 isNil := data == nil
1022 if !isNil {
1023 switch v := reflect.Indirect(reflect.ValueOf(data)); v.Kind() {
1024 case reflect.Chan,
1025 reflect.Func,
1026 reflect.Interface,
1027 reflect.Map,
1028 reflect.Ptr,
1029 reflect.Slice:
1030 isNil = v.IsNil()
1031 }
1032 }
1033 if isNil {
1034 if !val.IsNil() && val.CanSet() {
1035 nilValue := reflect.New(val.Type()).Elem()
1036 val.Set(nilValue)
1037 }
1038
1039 return true, nil
1040 }
1041
1042
1043
1044 valType := val.Type()
1045 valElemType := valType.Elem()
1046 if val.CanSet() {
1047 realVal := val
1048 if realVal.IsNil() || d.config.ZeroFields {
1049 realVal = reflect.New(valElemType)
1050 }
1051
1052 if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil {
1053 return false, err
1054 }
1055
1056 val.Set(realVal)
1057 } else {
1058 if err := d.decode(name, data, reflect.Indirect(val)); err != nil {
1059 return false, err
1060 }
1061 }
1062 return false, nil
1063 }
1064
1065 func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error {
1066
1067
1068 dataVal := reflect.Indirect(reflect.ValueOf(data))
1069 if val.Type() != dataVal.Type() {
1070 return fmt.Errorf(
1071 "'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
1072 name, val.Type(), dataVal.Type(), data)
1073 }
1074 val.Set(dataVal)
1075 return nil
1076 }
1077
1078 func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) error {
1079 dataVal := reflect.Indirect(reflect.ValueOf(data))
1080 dataValKind := dataVal.Kind()
1081 valType := val.Type()
1082 valElemType := valType.Elem()
1083 sliceType := reflect.SliceOf(valElemType)
1084
1085
1086 if dataValKind != reflect.Array && dataValKind != reflect.Slice {
1087 if d.config.WeaklyTypedInput {
1088 switch {
1089
1090 case dataValKind == reflect.Slice, dataValKind == reflect.Array:
1091 break
1092
1093
1094 case dataValKind == reflect.Map:
1095 if dataVal.Len() == 0 {
1096 val.Set(reflect.MakeSlice(sliceType, 0, 0))
1097 return nil
1098 }
1099
1100 return d.decodeSlice(name, []interface{}{data}, val)
1101
1102 case dataValKind == reflect.String && valElemType.Kind() == reflect.Uint8:
1103 return d.decodeSlice(name, []byte(dataVal.String()), val)
1104
1105
1106
1107 default:
1108
1109 return d.decodeSlice(name, []interface{}{data}, val)
1110 }
1111 }
1112
1113 return fmt.Errorf(
1114 "'%s': source data must be an array or slice, got %s", name, dataValKind)
1115 }
1116
1117
1118 if dataValKind != reflect.Array && dataVal.IsNil() {
1119 return nil
1120 }
1121
1122 valSlice := val
1123 if valSlice.IsNil() || d.config.ZeroFields {
1124
1125 valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len())
1126 }
1127
1128
1129 errors := make([]string, 0)
1130
1131 for i := 0; i < dataVal.Len(); i++ {
1132 currentData := dataVal.Index(i).Interface()
1133 for valSlice.Len() <= i {
1134 valSlice = reflect.Append(valSlice, reflect.Zero(valElemType))
1135 }
1136 currentField := valSlice.Index(i)
1137
1138 fieldName := name + "[" + strconv.Itoa(i) + "]"
1139 if err := d.decode(fieldName, currentData, currentField); err != nil {
1140 errors = appendErrors(errors, err)
1141 }
1142 }
1143
1144
1145 val.Set(valSlice)
1146
1147
1148 if len(errors) > 0 {
1149 return &Error{errors}
1150 }
1151
1152 return nil
1153 }
1154
1155 func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value) error {
1156 dataVal := reflect.Indirect(reflect.ValueOf(data))
1157 dataValKind := dataVal.Kind()
1158 valType := val.Type()
1159 valElemType := valType.Elem()
1160 arrayType := reflect.ArrayOf(valType.Len(), valElemType)
1161
1162 valArray := val
1163
1164 if valArray.Interface() == reflect.Zero(valArray.Type()).Interface() || d.config.ZeroFields {
1165
1166 if dataValKind != reflect.Array && dataValKind != reflect.Slice {
1167 if d.config.WeaklyTypedInput {
1168 switch {
1169
1170 case dataValKind == reflect.Map:
1171 if dataVal.Len() == 0 {
1172 val.Set(reflect.Zero(arrayType))
1173 return nil
1174 }
1175
1176
1177
1178 default:
1179
1180 return d.decodeArray(name, []interface{}{data}, val)
1181 }
1182 }
1183
1184 return fmt.Errorf(
1185 "'%s': source data must be an array or slice, got %s", name, dataValKind)
1186
1187 }
1188 if dataVal.Len() > arrayType.Len() {
1189 return fmt.Errorf(
1190 "'%s': expected source data to have length less or equal to %d, got %d", name, arrayType.Len(), dataVal.Len())
1191
1192 }
1193
1194
1195 valArray = reflect.New(arrayType).Elem()
1196 }
1197
1198
1199 errors := make([]string, 0)
1200
1201 for i := 0; i < dataVal.Len(); i++ {
1202 currentData := dataVal.Index(i).Interface()
1203 currentField := valArray.Index(i)
1204
1205 fieldName := name + "[" + strconv.Itoa(i) + "]"
1206 if err := d.decode(fieldName, currentData, currentField); err != nil {
1207 errors = appendErrors(errors, err)
1208 }
1209 }
1210
1211
1212 val.Set(valArray)
1213
1214
1215 if len(errors) > 0 {
1216 return &Error{errors}
1217 }
1218
1219 return nil
1220 }
1221
1222 func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) error {
1223 dataVal := reflect.Indirect(reflect.ValueOf(data))
1224
1225
1226
1227 if dataVal.Type() == val.Type() {
1228 val.Set(dataVal)
1229 return nil
1230 }
1231
1232 dataValKind := dataVal.Kind()
1233 switch dataValKind {
1234 case reflect.Map:
1235 return d.decodeStructFromMap(name, dataVal, val)
1236
1237 case reflect.Struct:
1238
1239
1240
1241
1242
1243 mapType := reflect.TypeOf((map[string]interface{})(nil))
1244 mval := reflect.MakeMap(mapType)
1245
1246
1247
1248
1249
1250 addrVal := reflect.New(mval.Type())
1251
1252 reflect.Indirect(addrVal).Set(mval)
1253 if err := d.decodeMapFromStruct(name, dataVal, reflect.Indirect(addrVal), mval); err != nil {
1254 return err
1255 }
1256
1257 result := d.decodeStructFromMap(name, reflect.Indirect(addrVal), val)
1258 return result
1259
1260 default:
1261 return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind())
1262 }
1263 }
1264
1265 func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) error {
1266 dataValType := dataVal.Type()
1267 if kind := dataValType.Key().Kind(); kind != reflect.String && kind != reflect.Interface {
1268 return fmt.Errorf(
1269 "'%s' needs a map with string keys, has '%s' keys",
1270 name, dataValType.Key().Kind())
1271 }
1272
1273 dataValKeys := make(map[reflect.Value]struct{})
1274 dataValKeysUnused := make(map[interface{}]struct{})
1275 for _, dataValKey := range dataVal.MapKeys() {
1276 dataValKeys[dataValKey] = struct{}{}
1277 dataValKeysUnused[dataValKey.Interface()] = struct{}{}
1278 }
1279
1280 targetValKeysUnused := make(map[interface{}]struct{})
1281 errors := make([]string, 0)
1282
1283
1284
1285
1286 structs := make([]reflect.Value, 1, 5)
1287 structs[0] = val
1288
1289
1290
1291 type field struct {
1292 field reflect.StructField
1293 val reflect.Value
1294 }
1295
1296
1297
1298 var remainField *field
1299
1300 fields := []field{}
1301 for len(structs) > 0 {
1302 structVal := structs[0]
1303 structs = structs[1:]
1304
1305 structType := structVal.Type()
1306
1307 for i := 0; i < structType.NumField(); i++ {
1308 fieldType := structType.Field(i)
1309 fieldVal := structVal.Field(i)
1310 if fieldVal.Kind() == reflect.Ptr && fieldVal.Elem().Kind() == reflect.Struct {
1311
1312 fieldVal = fieldVal.Elem()
1313 }
1314
1315
1316 squash := d.config.Squash && fieldVal.Kind() == reflect.Struct && fieldType.Anonymous
1317 remain := false
1318
1319
1320 tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",")
1321 for _, tag := range tagParts[1:] {
1322 if tag == "squash" {
1323 squash = true
1324 break
1325 }
1326
1327 if tag == "remain" {
1328 remain = true
1329 break
1330 }
1331 }
1332
1333 if squash {
1334 if fieldVal.Kind() != reflect.Struct {
1335 errors = appendErrors(errors,
1336 fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldVal.Kind()))
1337 } else {
1338 structs = append(structs, fieldVal)
1339 }
1340 continue
1341 }
1342
1343
1344 if remain {
1345 remainField = &field{fieldType, fieldVal}
1346 } else {
1347
1348 fields = append(fields, field{fieldType, fieldVal})
1349 }
1350 }
1351 }
1352
1353
1354 for _, f := range fields {
1355 field, fieldValue := f.field, f.val
1356 fieldName := field.Name
1357
1358 tagValue := field.Tag.Get(d.config.TagName)
1359 tagValue = strings.SplitN(tagValue, ",", 2)[0]
1360 if tagValue != "" {
1361 fieldName = tagValue
1362 }
1363
1364 rawMapKey := reflect.ValueOf(fieldName)
1365 rawMapVal := dataVal.MapIndex(rawMapKey)
1366 if !rawMapVal.IsValid() {
1367
1368
1369 for dataValKey := range dataValKeys {
1370 mK, ok := dataValKey.Interface().(string)
1371 if !ok {
1372
1373 continue
1374 }
1375
1376 if d.config.MatchName(mK, fieldName) {
1377 rawMapKey = dataValKey
1378 rawMapVal = dataVal.MapIndex(dataValKey)
1379 break
1380 }
1381 }
1382
1383 if !rawMapVal.IsValid() {
1384
1385
1386 targetValKeysUnused[fieldName] = struct{}{}
1387 continue
1388 }
1389 }
1390
1391 if !fieldValue.IsValid() {
1392
1393 panic("field is not valid")
1394 }
1395
1396
1397
1398 if !fieldValue.CanSet() {
1399 continue
1400 }
1401
1402
1403 delete(dataValKeysUnused, rawMapKey.Interface())
1404
1405
1406
1407 if name != "" {
1408 fieldName = name + "." + fieldName
1409 }
1410
1411 if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil {
1412 errors = appendErrors(errors, err)
1413 }
1414 }
1415
1416
1417
1418 if remainField != nil && len(dataValKeysUnused) > 0 {
1419
1420 remain := map[interface{}]interface{}{}
1421 for key := range dataValKeysUnused {
1422 remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface()
1423 }
1424
1425
1426 if err := d.decodeMap(name, remain, remainField.val); err != nil {
1427 errors = appendErrors(errors, err)
1428 }
1429
1430
1431
1432 dataValKeysUnused = nil
1433 }
1434
1435 if d.config.ErrorUnused && len(dataValKeysUnused) > 0 {
1436 keys := make([]string, 0, len(dataValKeysUnused))
1437 for rawKey := range dataValKeysUnused {
1438 keys = append(keys, rawKey.(string))
1439 }
1440 sort.Strings(keys)
1441
1442 err := fmt.Errorf("'%s' has invalid keys: %s", name, strings.Join(keys, ", "))
1443 errors = appendErrors(errors, err)
1444 }
1445
1446 if d.config.ErrorUnset && len(targetValKeysUnused) > 0 {
1447 keys := make([]string, 0, len(targetValKeysUnused))
1448 for rawKey := range targetValKeysUnused {
1449 keys = append(keys, rawKey.(string))
1450 }
1451 sort.Strings(keys)
1452
1453 err := fmt.Errorf("'%s' has unset fields: %s", name, strings.Join(keys, ", "))
1454 errors = appendErrors(errors, err)
1455 }
1456
1457 if len(errors) > 0 {
1458 return &Error{errors}
1459 }
1460
1461
1462 if d.config.Metadata != nil {
1463 for rawKey := range dataValKeysUnused {
1464 key := rawKey.(string)
1465 if name != "" {
1466 key = name + "." + key
1467 }
1468
1469 d.config.Metadata.Unused = append(d.config.Metadata.Unused, key)
1470 }
1471 for rawKey := range targetValKeysUnused {
1472 key := rawKey.(string)
1473 if name != "" {
1474 key = name + "." + key
1475 }
1476
1477 d.config.Metadata.Unset = append(d.config.Metadata.Unset, key)
1478 }
1479 }
1480
1481 return nil
1482 }
1483
1484 func isEmptyValue(v reflect.Value) bool {
1485 switch getKind(v) {
1486 case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
1487 return v.Len() == 0
1488 case reflect.Bool:
1489 return !v.Bool()
1490 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
1491 return v.Int() == 0
1492 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
1493 return v.Uint() == 0
1494 case reflect.Float32, reflect.Float64:
1495 return v.Float() == 0
1496 case reflect.Interface, reflect.Ptr:
1497 return v.IsNil()
1498 }
1499 return false
1500 }
1501
1502 func getKind(val reflect.Value) reflect.Kind {
1503 kind := val.Kind()
1504
1505 switch {
1506 case kind >= reflect.Int && kind <= reflect.Int64:
1507 return reflect.Int
1508 case kind >= reflect.Uint && kind <= reflect.Uint64:
1509 return reflect.Uint
1510 case kind >= reflect.Float32 && kind <= reflect.Float64:
1511 return reflect.Float32
1512 default:
1513 return kind
1514 }
1515 }
1516
1517 func isStructTypeConvertibleToMap(typ reflect.Type, checkMapstructureTags bool, tagName string) bool {
1518 for i := 0; i < typ.NumField(); i++ {
1519 f := typ.Field(i)
1520 if f.PkgPath == "" && !checkMapstructureTags {
1521 return true
1522 }
1523 if checkMapstructureTags && f.Tag.Get(tagName) != "" {
1524 return true
1525 }
1526 }
1527 return false
1528 }
1529
1530 func dereferencePtrToStructIfNeeded(v reflect.Value, tagName string) reflect.Value {
1531 if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct {
1532 return v
1533 }
1534 deref := v.Elem()
1535 derefT := deref.Type()
1536 if isStructTypeConvertibleToMap(derefT, true, tagName) {
1537 return deref
1538 }
1539 return v
1540 }
1541
View as plain text