util/reflect: detect json.Unmarshaler #328

Merged
vtolstov merged 1 commits from utilsort into v3 2024-04-02 08:52:12 +03:00

View File

@ -1,6 +1,7 @@
package reflect // import "go.unistack.org/micro/v3/util/reflect" package reflect
import ( import (
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"reflect" "reflect"
@ -45,15 +46,23 @@ func SliceAppend(b bool) Option {
// Merge merges map[string]interface{} to destination struct // Merge merges map[string]interface{} to destination struct
func Merge(dst interface{}, mp map[string]interface{}, opts ...Option) error { func Merge(dst interface{}, mp map[string]interface{}, opts ...Option) error {
var err error
var sval reflect.Value
var fname string
options := Options{} options := Options{}
for _, o := range opts { for _, o := range opts {
o(&options) 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) dviface := reflect.ValueOf(dst)
if dviface.Kind() == reflect.Ptr { if dviface.Kind() == reflect.Ptr {
dviface = dviface.Elem() dviface = dviface.Elem()