Decode pointers
diff --git a/mapstructure.go b/mapstructure.go index 1e17e76..cdd87c0 100644 --- a/mapstructure.go +++ b/mapstructure.go
@@ -182,6 +182,8 @@ err = d.decodeStruct(name, data, val) case reflect.Map: err = d.decodeMap(name, data, val) + case reflect.Ptr: + err = d.decodePtr(name, data, val) case reflect.Slice: err = d.decodeSlice(name, data, val) default: @@ -444,6 +446,20 @@ return nil } +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + valType := val.Type() + valElemType := valType.Elem() + realVal := reflect.New(valElemType) + if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { + return err + } + + val.Set(realVal) + return nil +} + func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) error { dataVal := reflect.Indirect(reflect.ValueOf(data)) dataValKind := dataVal.Kind()
diff --git a/mapstructure_test.go b/mapstructure_test.go index 8d86099..6b83c66 100644 --- a/mapstructure_test.go +++ b/mapstructure_test.go
@@ -46,6 +46,11 @@ Vbar Basic } +type NestedPointer struct { + Vfoo string + Vbar *Basic +} + type Slice struct { Vfoo string Vbar []string @@ -536,7 +541,7 @@ }, } - var result Nested + var result NestedPointer err := Decode(input, &result) if err != nil { t.Fatalf("got an err: %s", err.Error())