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())