feat: support **struct in mapping (#2784)

* feat: support **struct in mapping

* chore: fix test failure
This commit is contained in:
Kevin Wan
2023-01-12 20:45:32 +08:00
committed by GitHub
parent 367afb544c
commit 4d7fa08b0b
6 changed files with 179 additions and 116 deletions

View File

@@ -77,7 +77,7 @@ func (u *Unmarshaler) Unmarshal(i interface{}, v interface{}) error {
return errValueNotSettable
}
elemType := valueType.Elem()
elemType := Deref(valueType)
switch iv := i.(type) {
case map[string]interface{}:
if elemType.Kind() != reflect.Struct {
@@ -818,15 +818,22 @@ func (u *Unmarshaler) unmarshalWithFullName(m valuerWithParent, v interface{}, f
return err
}
rte := reflect.TypeOf(v).Elem()
if rte.Kind() != reflect.Struct {
valueType := reflect.TypeOf(v)
baseType := Deref(valueType)
if baseType.Kind() != reflect.Struct {
return errValueNotStruct
}
rve := rv.Elem()
numFields := rte.NumField()
valElem := rv.Elem()
if valElem.Kind() == reflect.Ptr {
target := reflect.New(baseType).Elem()
SetValue(valueType.Elem(), valElem, target)
valElem = target
}
numFields := baseType.NumField()
for i := 0; i < numFields; i++ {
if err := u.processField(rte.Field(i), rve.Field(i), m, fullName); err != nil {
if err := u.processField(baseType.Field(i), valElem.Field(i), m, fullName); err != nil {
return err
}
}