@@ -414,18 +414,18 @@ func NewDecoder(config *DecoderConfig) (*Decoder, error) {
414414// Decode decodes the given raw interface to the target pointer specified
415415// by the configuration.
416416func (d * Decoder ) Decode (input interface {}) error {
417- return d .decode ("" , input , reflect .ValueOf (d .config .Result ).Elem ())
417+ return d .decode ("" , input , reflect .ValueOf (d .config .Result ).Elem (), true )
418418}
419419
420420// Decodes an unknown data type into a specific reflection value.
421- func (d * Decoder ) decode (name string , input interface {}, outVal reflect.Value ) error {
421+ func (d * Decoder ) decode (name string , input interface {}, outVal reflect.Value , skipTypedNil bool ) error {
422422 var inputVal reflect.Value
423423 if input != nil {
424424 inputVal = reflect .ValueOf (input )
425425
426426 // We need to check here if input is a typed nil. Typed nils won't
427427 // match the "input == nil" below so we check that here.
428- if inputVal .Kind () == reflect .Ptr && inputVal .IsNil () {
428+ if skipTypedNil && inputVal .Kind () == reflect .Ptr && inputVal .IsNil () {
429429 input = nil
430430 }
431431 }
@@ -529,7 +529,7 @@ func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value)
529529
530530 // Decode. If we have an error then return. We also return right
531531 // away if we're not a copy because that means we decoded directly.
532- if err := d .decode (name , data , elem ); err != nil || ! copied {
532+ if err := d .decode (name , data , elem , true ); err != nil || ! copied {
533533 return err
534534 }
535535
@@ -842,7 +842,7 @@ func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val ref
842842 for i := 0 ; i < dataVal .Len (); i ++ {
843843 err := d .decode (
844844 name + "[" + strconv .Itoa (i )+ "]" ,
845- dataVal .Index (i ).Interface (), val )
845+ dataVal .Index (i ).Interface (), val , true )
846846 if err != nil {
847847 return err
848848 }
@@ -878,15 +878,15 @@ func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val refle
878878
879879 // First decode the key into the proper type
880880 currentKey := reflect .Indirect (reflect .New (valKeyType ))
881- if err := d .decode (fieldName , k .Interface (), currentKey ); err != nil {
881+ if err := d .decode (fieldName , k .Interface (), currentKey , true ); err != nil {
882882 errors = appendErrors (errors , err )
883883 continue
884884 }
885885
886886 // Next decode the data into the proper type
887887 v := dataVal .MapIndex (k ).Interface ()
888888 currentVal := reflect .Indirect (reflect .New (valElemType ))
889- if err := d .decode (fieldName , v , currentVal ); err != nil {
889+ if err := d .decode (fieldName , v , currentVal , true ); err != nil {
890890 errors = appendErrors (errors , err )
891891 continue
892892 }
@@ -983,7 +983,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re
983983 addrVal := reflect .New (vMap .Type ())
984984 reflect .Indirect (addrVal ).Set (vMap )
985985
986- err := d .decode (keyName , x .Interface (), reflect .Indirect (addrVal ))
986+ err := d .decode (keyName , x .Interface (), reflect .Indirect (addrVal ), true )
987987 if err != nil {
988988 return err
989989 }
@@ -1002,7 +1002,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re
10021002
10031003 default :
10041004 currentVal := reflect .Indirect (reflect .New (valMap .Type ().Elem ()))
1005- err := d .decode (keyName , v .Interface (), currentVal )
1005+ err := d .decode (keyName , v .Interface (), currentVal , false )
10061006 if err != nil {
10071007 return err
10081008 }
@@ -1052,13 +1052,13 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (b
10521052 realVal = reflect .New (valElemType )
10531053 }
10541054
1055- if err := d .decode (name , data , reflect .Indirect (realVal )); err != nil {
1055+ if err := d .decode (name , data , reflect .Indirect (realVal ), true ); err != nil {
10561056 return false , err
10571057 }
10581058
10591059 val .Set (realVal )
10601060 } else {
1061- if err := d .decode (name , data , reflect .Indirect (val )); err != nil {
1061+ if err := d .decode (name , data , reflect .Indirect (val ), true ); err != nil {
10621062 return false , err
10631063 }
10641064 }
@@ -1141,7 +1141,7 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value)
11411141 currentField := valSlice .Index (i )
11421142
11431143 fieldName := name + "[" + strconv .Itoa (i ) + "]"
1144- if err := d .decode (fieldName , currentData , currentField ); err != nil {
1144+ if err := d .decode (fieldName , currentData , currentField , true ); err != nil {
11451145 errors = appendErrors (errors , err )
11461146 }
11471147 }
@@ -1208,7 +1208,7 @@ func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value)
12081208 currentField := valArray .Index (i )
12091209
12101210 fieldName := name + "[" + strconv .Itoa (i ) + "]"
1211- if err := d .decode (fieldName , currentData , currentField ); err != nil {
1211+ if err := d .decode (fieldName , currentData , currentField , true ); err != nil {
12121212 errors = appendErrors (errors , err )
12131213 }
12141214 }
@@ -1413,7 +1413,7 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
14131413 fieldName = name + "." + fieldName
14141414 }
14151415
1416- if err := d .decode (fieldName , rawMapVal .Interface (), fieldValue ); err != nil {
1416+ if err := d .decode (fieldName , rawMapVal .Interface (), fieldValue , true ); err != nil {
14171417 errors = appendErrors (errors , err )
14181418 }
14191419 }
0 commit comments