Merge pull request 'util/reflect: detect json.Unmarshaler' (#328) from utilsort into v3
Reviewed-on: #328
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| package reflect // import "go.unistack.org/micro/v3/util/reflect" | ||||
| package reflect | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| @@ -45,15 +46,23 @@ func SliceAppend(b bool) Option { | ||||
|  | ||||
| // Merge merges map[string]interface{} to destination struct | ||||
| func Merge(dst interface{}, mp map[string]interface{}, opts ...Option) error { | ||||
| 	var err error | ||||
| 	var sval reflect.Value | ||||
| 	var fname string | ||||
|  | ||||
| 	options := Options{} | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
|  | ||||
| 	if unmarshaler, ok := dst.(json.Unmarshaler); ok { | ||||
| 		buf, err := json.Marshal(mp) | ||||
| 		if err == nil { | ||||
| 			err = unmarshaler.UnmarshalJSON(buf) | ||||
| 		} | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	var err error | ||||
| 	var sval reflect.Value | ||||
| 	var fname string | ||||
|  | ||||
| 	dviface := reflect.ValueOf(dst) | ||||
| 	if dviface.Kind() == reflect.Ptr { | ||||
| 		dviface = dviface.Elem() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user