|
@@ -138,6 +138,45 @@ func Set(hacky interface{}, field string, value interface{}) (err error) {
|
|
|
return
|
|
|
}
|
|
|
switch fieldKind {
|
|
|
+ case reflect.Struct:
|
|
|
+ switch rv.Kind() {
|
|
|
+ case reflect.Map:
|
|
|
+ keys := rv.MapKeys()
|
|
|
+ subVal := reflect.New(refField.Type())
|
|
|
+ for _, key := range keys {
|
|
|
+ pv := rv.MapIndex(key)
|
|
|
+ if key.Kind() == reflect.String {
|
|
|
+ if err = Set(subVal.Interface(), key.String(), pv.Interface()); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ refField.Set(subVal.Elem())
|
|
|
+ default:
|
|
|
+ err = fmt.Errorf("struct unsupported assign kind %s", rv.Kind())
|
|
|
+ }
|
|
|
+ case reflect.Ptr:
|
|
|
+ elemType := refField.Type()
|
|
|
+ if elemType.Elem().Kind() == reflect.Struct {
|
|
|
+ switch rv.Kind() {
|
|
|
+ case reflect.Map:
|
|
|
+ keys := rv.MapKeys()
|
|
|
+ subVal := reflect.New(elemType.Elem())
|
|
|
+ for _, key := range keys {
|
|
|
+ pv := rv.MapIndex(key)
|
|
|
+ if key.Kind() == reflect.String {
|
|
|
+ if err = Set(subVal.Interface(), key.String(), pv.Interface()); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ refField.Set(subVal)
|
|
|
+ default:
|
|
|
+ err = fmt.Errorf("struct unsupported assign kind %s", rv.Kind())
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ err = fmt.Errorf("ptr can't set kind %s", elemType.Elem().Kind())
|
|
|
+ }
|
|
|
case reflect.Array, reflect.Slice:
|
|
|
innerType := refField.Type().Elem()
|
|
|
if rv.Kind() == reflect.Array || rv.Kind() == reflect.Slice {
|