github.com/hduhelp/go-zero@v1.4.3/core/mapping/unmarshaler.go (about)

     1  package mapping
     2  
     3  import (
     4  	"encoding"
     5  	"encoding/json"
     6  	"errors"
     7  	"fmt"
     8  	"reflect"
     9  	"strings"
    10  	"sync"
    11  	"time"
    12  
    13  	"github.com/hduhelp/go-zero/core/jsonx"
    14  	"github.com/hduhelp/go-zero/core/lang"
    15  	"github.com/hduhelp/go-zero/core/stringx"
    16  )
    17  
    18  const (
    19  	defaultKeyName = "key"
    20  	delimiter      = '.'
    21  )
    22  
    23  var (
    24  	errTypeMismatch     = errors.New("type mismatch")
    25  	errValueNotSettable = errors.New("value is not settable")
    26  	errValueNotStruct   = errors.New("value type is not struct")
    27  	keyUnmarshaler      = NewUnmarshaler(defaultKeyName)
    28  	durationType        = reflect.TypeOf(time.Duration(0))
    29  	cacheKeys           = make(map[string][]string)
    30  	cacheKeysLock       sync.Mutex
    31  	defaultCache        = make(map[string]interface{})
    32  	defaultCacheLock    sync.Mutex
    33  	emptyMap            = map[string]interface{}{}
    34  	emptyValue          = reflect.ValueOf(lang.Placeholder)
    35  )
    36  
    37  type (
    38  	// Unmarshaler is used to unmarshal with given tag key.
    39  	Unmarshaler struct {
    40  		key  string
    41  		opts unmarshalOptions
    42  	}
    43  
    44  	// UnmarshalOption defines the method to customize an Unmarshaler.
    45  	UnmarshalOption func(*unmarshalOptions)
    46  
    47  	unmarshalOptions struct {
    48  		fromString   bool
    49  		canonicalKey func(key string) string
    50  	}
    51  )
    52  
    53  // NewUnmarshaler returns an Unmarshaler.
    54  func NewUnmarshaler(key string, opts ...UnmarshalOption) *Unmarshaler {
    55  	unmarshaler := Unmarshaler{
    56  		key: key,
    57  	}
    58  
    59  	for _, opt := range opts {
    60  		opt(&unmarshaler.opts)
    61  	}
    62  
    63  	return &unmarshaler
    64  }
    65  
    66  // UnmarshalKey unmarshals m into v with tag key.
    67  func UnmarshalKey(m map[string]interface{}, v interface{}) error {
    68  	return keyUnmarshaler.Unmarshal(m, v)
    69  }
    70  
    71  // Unmarshal unmarshals m into v.
    72  func (u *Unmarshaler) Unmarshal(m map[string]interface{}, v interface{}) error {
    73  	return u.UnmarshalValuer(MapValuer(m), v)
    74  }
    75  
    76  // UnmarshalValuer unmarshals m into v.
    77  func (u *Unmarshaler) UnmarshalValuer(m Valuer, v interface{}) error {
    78  	return u.unmarshalWithFullName(m, v, "")
    79  }
    80  
    81  func (u *Unmarshaler) unmarshalWithFullName(m Valuer, v interface{}, fullName string) error {
    82  	rv := reflect.ValueOf(v)
    83  	if err := ValidatePtr(&rv); err != nil {
    84  		return err
    85  	}
    86  
    87  	rte := reflect.TypeOf(v).Elem()
    88  	if rte.Kind() != reflect.Struct {
    89  		return errValueNotStruct
    90  	}
    91  
    92  	rve := rv.Elem()
    93  	numFields := rte.NumField()
    94  	for i := 0; i < numFields; i++ {
    95  		field := rte.Field(i)
    96  		if err := u.processField(field, rve.Field(i), m, fullName); err != nil {
    97  			return err
    98  		}
    99  	}
   100  
   101  	return nil
   102  }
   103  
   104  func (u *Unmarshaler) processAnonymousField(field reflect.StructField, value reflect.Value,
   105  	m Valuer, fullName string) error {
   106  	key, options, err := u.parseOptionsWithContext(field, m, fullName)
   107  	if err != nil {
   108  		return err
   109  	}
   110  
   111  	if _, hasValue := getValue(m, key); hasValue {
   112  		return fmt.Errorf("fields of %s can't be wrapped inside, because it's anonymous", key)
   113  	}
   114  
   115  	if options.optional() {
   116  		return u.processAnonymousFieldOptional(field, value, key, m, fullName)
   117  	}
   118  
   119  	return u.processAnonymousFieldRequired(field, value, m, fullName)
   120  }
   121  
   122  func (u *Unmarshaler) processAnonymousFieldOptional(field reflect.StructField, value reflect.Value,
   123  	key string, m Valuer, fullName string) error {
   124  	var filled bool
   125  	var required int
   126  	var requiredFilled int
   127  	var indirectValue reflect.Value
   128  	fieldType := Deref(field.Type)
   129  
   130  	for i := 0; i < fieldType.NumField(); i++ {
   131  		subField := fieldType.Field(i)
   132  		fieldKey, fieldOpts, err := u.parseOptionsWithContext(subField, m, fullName)
   133  		if err != nil {
   134  			return err
   135  		}
   136  
   137  		_, hasValue := getValue(m, fieldKey)
   138  		if hasValue {
   139  			if !filled {
   140  				filled = true
   141  				maybeNewValue(field, value)
   142  				indirectValue = reflect.Indirect(value)
   143  			}
   144  			if err = u.processField(subField, indirectValue.Field(i), m, fullName); err != nil {
   145  				return err
   146  			}
   147  		}
   148  		if !fieldOpts.optional() {
   149  			required++
   150  			if hasValue {
   151  				requiredFilled++
   152  			}
   153  		}
   154  	}
   155  
   156  	if filled && required != requiredFilled {
   157  		return fmt.Errorf("%s is not fully set", key)
   158  	}
   159  
   160  	return nil
   161  }
   162  
   163  func (u *Unmarshaler) processAnonymousFieldRequired(field reflect.StructField, value reflect.Value,
   164  	m Valuer, fullName string) error {
   165  	maybeNewValue(field, value)
   166  	fieldType := Deref(field.Type)
   167  	indirectValue := reflect.Indirect(value)
   168  
   169  	for i := 0; i < fieldType.NumField(); i++ {
   170  		if err := u.processField(fieldType.Field(i), indirectValue.Field(i), m, fullName); err != nil {
   171  			return err
   172  		}
   173  	}
   174  
   175  	return nil
   176  }
   177  
   178  func (u *Unmarshaler) processField(field reflect.StructField, value reflect.Value, m Valuer,
   179  	fullName string) error {
   180  	if usingDifferentKeys(u.key, field) {
   181  		return nil
   182  	}
   183  
   184  	if field.Anonymous {
   185  		return u.processAnonymousField(field, value, m, fullName)
   186  	}
   187  
   188  	return u.processNamedField(field, value, m, fullName)
   189  }
   190  
   191  func (u *Unmarshaler) processFieldNotFromString(field reflect.StructField, value reflect.Value,
   192  	mapValue interface{}, opts *fieldOptionsWithContext, fullName string) error {
   193  	fieldType := field.Type
   194  	derefedFieldType := Deref(fieldType)
   195  	typeKind := derefedFieldType.Kind()
   196  	valueKind := reflect.TypeOf(mapValue).Kind()
   197  
   198  	switch {
   199  	case valueKind == reflect.Map && typeKind == reflect.Struct:
   200  		return u.processFieldStruct(field, value, mapValue, fullName)
   201  	case valueKind == reflect.Map && typeKind == reflect.Map:
   202  		return u.fillMap(field, value, mapValue)
   203  	case valueKind == reflect.String && typeKind == reflect.Map:
   204  		return u.fillMapFromString(value, mapValue)
   205  	case valueKind == reflect.String && typeKind == reflect.Slice:
   206  		return u.fillSliceFromString(fieldType, value, mapValue)
   207  	case valueKind == reflect.String && derefedFieldType == durationType:
   208  		return fillDurationValue(fieldType.Kind(), value, mapValue.(string))
   209  	default:
   210  		return u.processFieldPrimitive(field, value, mapValue, opts, fullName)
   211  	}
   212  }
   213  
   214  func (u *Unmarshaler) processFieldPrimitive(field reflect.StructField, value reflect.Value,
   215  	mapValue interface{}, opts *fieldOptionsWithContext, fullName string) error {
   216  	fieldType := field.Type
   217  	typeKind := Deref(fieldType).Kind()
   218  	valueKind := reflect.TypeOf(mapValue).Kind()
   219  
   220  	switch {
   221  	case typeKind == reflect.Slice && valueKind == reflect.Slice:
   222  		return u.fillSlice(fieldType, value, mapValue)
   223  	case typeKind == reflect.Map && valueKind == reflect.Map:
   224  		return u.fillMap(field, value, mapValue)
   225  	default:
   226  		switch v := mapValue.(type) {
   227  		case json.Number:
   228  			return u.processFieldPrimitiveWithJSONNumber(field, value, v, opts, fullName)
   229  		default:
   230  			if typeKind == valueKind {
   231  				if err := validateValueInOptions(mapValue, opts.options()); err != nil {
   232  					return err
   233  				}
   234  
   235  				return fillWithSameType(field, value, mapValue, opts)
   236  			}
   237  		}
   238  	}
   239  
   240  	return newTypeMismatchError(fullName)
   241  }
   242  
   243  func (u *Unmarshaler) processFieldPrimitiveWithJSONNumber(field reflect.StructField, value reflect.Value,
   244  	v json.Number, opts *fieldOptionsWithContext, fullName string) error {
   245  	fieldType := field.Type
   246  	fieldKind := fieldType.Kind()
   247  	typeKind := Deref(fieldType).Kind()
   248  
   249  	if err := validateJsonNumberRange(v, opts); err != nil {
   250  		return err
   251  	}
   252  
   253  	if err := validateValueInOptions(v, opts.options()); err != nil {
   254  		return err
   255  	}
   256  
   257  	if fieldKind == reflect.Ptr {
   258  		value = value.Elem()
   259  	}
   260  
   261  	switch typeKind {
   262  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   263  		iValue, err := v.Int64()
   264  		if err != nil {
   265  			return err
   266  		}
   267  
   268  		value.SetInt(iValue)
   269  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
   270  		iValue, err := v.Int64()
   271  		if err != nil {
   272  			return err
   273  		}
   274  
   275  		if iValue < 0 {
   276  			return fmt.Errorf("unmarshal %q with bad value %q", fullName, v.String())
   277  		}
   278  
   279  		value.SetUint(uint64(iValue))
   280  	case reflect.Float32, reflect.Float64:
   281  		fValue, err := v.Float64()
   282  		if err != nil {
   283  			return err
   284  		}
   285  
   286  		value.SetFloat(fValue)
   287  	default:
   288  		return newTypeMismatchError(fullName)
   289  	}
   290  
   291  	return nil
   292  }
   293  
   294  func (u *Unmarshaler) processFieldStruct(field reflect.StructField, value reflect.Value,
   295  	mapValue interface{}, fullName string) error {
   296  	convertedValue, ok := mapValue.(map[string]interface{})
   297  	if !ok {
   298  		valueKind := reflect.TypeOf(mapValue).Kind()
   299  		return fmt.Errorf("error: field: %s, expect map[string]interface{}, actual %v", fullName, valueKind)
   300  	}
   301  
   302  	return u.processFieldStructWithMap(field, value, MapValuer(convertedValue), fullName)
   303  }
   304  
   305  func (u *Unmarshaler) processFieldStructWithMap(field reflect.StructField, value reflect.Value,
   306  	m Valuer, fullName string) error {
   307  	if field.Type.Kind() == reflect.Ptr {
   308  		baseType := Deref(field.Type)
   309  		target := reflect.New(baseType).Elem()
   310  		if err := u.unmarshalWithFullName(m, target.Addr().Interface(), fullName); err != nil {
   311  			return err
   312  		}
   313  
   314  		value.Set(target.Addr())
   315  	} else if err := u.unmarshalWithFullName(m, value.Addr().Interface(), fullName); err != nil {
   316  		return err
   317  	}
   318  
   319  	return nil
   320  }
   321  
   322  func (u *Unmarshaler) processFieldTextUnmarshaler(field reflect.StructField, value reflect.Value,
   323  	mapValue interface{}) (bool, error) {
   324  	var tval encoding.TextUnmarshaler
   325  	var ok bool
   326  
   327  	if field.Type.Kind() == reflect.Ptr {
   328  		tval, ok = value.Interface().(encoding.TextUnmarshaler)
   329  	} else {
   330  		tval, ok = value.Addr().Interface().(encoding.TextUnmarshaler)
   331  	}
   332  	if ok {
   333  		switch mv := mapValue.(type) {
   334  		case string:
   335  			return true, tval.UnmarshalText([]byte(mv))
   336  		case []byte:
   337  			return true, tval.UnmarshalText(mv)
   338  		}
   339  	}
   340  
   341  	return false, nil
   342  }
   343  
   344  func (u *Unmarshaler) processNamedField(field reflect.StructField, value reflect.Value,
   345  	m Valuer, fullName string) error {
   346  	key, opts, err := u.parseOptionsWithContext(field, m, fullName)
   347  	if err != nil {
   348  		return err
   349  	}
   350  
   351  	fullName = join(fullName, key)
   352  	canonicalKey := key
   353  	if u.opts.canonicalKey != nil {
   354  		canonicalKey = u.opts.canonicalKey(key)
   355  	}
   356  	mapValue, hasValue := getValue(m, canonicalKey)
   357  	if hasValue {
   358  		return u.processNamedFieldWithValue(field, value, mapValue, key, opts, fullName)
   359  	}
   360  
   361  	return u.processNamedFieldWithoutValue(field, value, opts, fullName)
   362  }
   363  
   364  func (u *Unmarshaler) processNamedFieldWithValue(field reflect.StructField, value reflect.Value,
   365  	mapValue interface{}, key string, opts *fieldOptionsWithContext, fullName string) error {
   366  	if mapValue == nil {
   367  		if opts.optional() {
   368  			return nil
   369  		}
   370  
   371  		return fmt.Errorf("field %s mustn't be nil", key)
   372  	}
   373  
   374  	if !value.CanSet() {
   375  		return fmt.Errorf("field %s is not settable", key)
   376  	}
   377  
   378  	maybeNewValue(field, value)
   379  
   380  	if yes, err := u.processFieldTextUnmarshaler(field, value, mapValue); yes {
   381  		return err
   382  	}
   383  
   384  	fieldKind := Deref(field.Type).Kind()
   385  	switch fieldKind {
   386  	case reflect.Array, reflect.Map, reflect.Slice, reflect.Struct:
   387  		return u.processFieldNotFromString(field, value, mapValue, opts, fullName)
   388  	default:
   389  		if u.opts.fromString || opts.fromString() {
   390  			valueKind := reflect.TypeOf(mapValue).Kind()
   391  			if valueKind != reflect.String {
   392  				return fmt.Errorf("error: the value in map is not string, but %s", valueKind)
   393  			}
   394  
   395  			options := opts.options()
   396  			if len(options) > 0 {
   397  				if !stringx.Contains(options, mapValue.(string)) {
   398  					return fmt.Errorf(`error: value "%s" for field "%s" is not defined in options "%v"`,
   399  						mapValue, key, options)
   400  				}
   401  			}
   402  
   403  			return fillPrimitive(field.Type, value, mapValue, opts, fullName)
   404  		}
   405  
   406  		return u.processFieldNotFromString(field, value, mapValue, opts, fullName)
   407  	}
   408  }
   409  
   410  func (u *Unmarshaler) processNamedFieldWithoutValue(field reflect.StructField, value reflect.Value,
   411  	opts *fieldOptionsWithContext, fullName string) error {
   412  	derefedType := Deref(field.Type)
   413  	fieldKind := derefedType.Kind()
   414  	if defaultValue, ok := opts.getDefault(); ok {
   415  		if field.Type.Kind() == reflect.Ptr {
   416  			maybeNewValue(field, value)
   417  			value = value.Elem()
   418  		}
   419  		if derefedType == durationType {
   420  			return fillDurationValue(fieldKind, value, defaultValue)
   421  		}
   422  
   423  		switch fieldKind {
   424  		case reflect.Array, reflect.Slice:
   425  			return u.fillSliceWithDefault(derefedType, value, defaultValue)
   426  		default:
   427  			return setValue(fieldKind, value, defaultValue)
   428  		}
   429  	}
   430  
   431  	switch fieldKind {
   432  	case reflect.Array, reflect.Map, reflect.Slice:
   433  		if !opts.optional() {
   434  			return u.processFieldNotFromString(field, value, emptyMap, opts, fullName)
   435  		}
   436  	case reflect.Struct:
   437  		if !opts.optional() {
   438  			required, err := structValueRequired(u.key, derefedType)
   439  			if err != nil {
   440  				return err
   441  			}
   442  			if required {
   443  				return fmt.Errorf("%q is not set", fullName)
   444  			}
   445  			return u.processFieldNotFromString(field, value, emptyMap, opts, fullName)
   446  		}
   447  	default:
   448  		if !opts.optional() {
   449  			return newInitError(fullName)
   450  		}
   451  	}
   452  
   453  	return nil
   454  }
   455  
   456  func (u *Unmarshaler) fillMap(field reflect.StructField, value reflect.Value, mapValue interface{}) error {
   457  	if !value.CanSet() {
   458  		return errValueNotSettable
   459  	}
   460  
   461  	fieldKeyType := field.Type.Key()
   462  	fieldElemType := field.Type.Elem()
   463  	targetValue, err := u.generateMap(fieldKeyType, fieldElemType, mapValue)
   464  	if err != nil {
   465  		return err
   466  	}
   467  
   468  	value.Set(targetValue)
   469  	return nil
   470  }
   471  
   472  func (u *Unmarshaler) fillMapFromString(value reflect.Value, mapValue interface{}) error {
   473  	if !value.CanSet() {
   474  		return errValueNotSettable
   475  	}
   476  
   477  	switch v := mapValue.(type) {
   478  	case fmt.Stringer:
   479  		if err := jsonx.UnmarshalFromString(v.String(), value.Addr().Interface()); err != nil {
   480  			return err
   481  		}
   482  	case string:
   483  		if err := jsonx.UnmarshalFromString(v, value.Addr().Interface()); err != nil {
   484  			return err
   485  		}
   486  	default:
   487  		return errUnsupportedType
   488  	}
   489  
   490  	return nil
   491  }
   492  
   493  func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value, mapValue interface{}) error {
   494  	if !value.CanSet() {
   495  		return errValueNotSettable
   496  	}
   497  
   498  	baseType := fieldType.Elem()
   499  	baseKind := baseType.Kind()
   500  	dereffedBaseType := Deref(baseType)
   501  	dereffedBaseKind := dereffedBaseType.Kind()
   502  	refValue := reflect.ValueOf(mapValue)
   503  	if refValue.IsNil() {
   504  		return nil
   505  	}
   506  
   507  	conv := reflect.MakeSlice(reflect.SliceOf(baseType), refValue.Len(), refValue.Cap())
   508  	if refValue.Len() == 0 {
   509  		value.Set(conv)
   510  		return nil
   511  	}
   512  
   513  	var valid bool
   514  	for i := 0; i < refValue.Len(); i++ {
   515  		ithValue := refValue.Index(i).Interface()
   516  		if ithValue == nil {
   517  			continue
   518  		}
   519  
   520  		valid = true
   521  		switch dereffedBaseKind {
   522  		case reflect.Struct:
   523  			target := reflect.New(dereffedBaseType)
   524  			if err := u.Unmarshal(ithValue.(map[string]interface{}), target.Interface()); err != nil {
   525  				return err
   526  			}
   527  
   528  			if baseKind == reflect.Ptr {
   529  				conv.Index(i).Set(target)
   530  			} else {
   531  				conv.Index(i).Set(target.Elem())
   532  			}
   533  		case reflect.Slice:
   534  			if err := u.fillSlice(dereffedBaseType, conv.Index(i), ithValue); err != nil {
   535  				return err
   536  			}
   537  		default:
   538  			if err := u.fillSliceValue(conv, i, dereffedBaseKind, ithValue); err != nil {
   539  				return err
   540  			}
   541  		}
   542  	}
   543  
   544  	if valid {
   545  		value.Set(conv)
   546  	}
   547  
   548  	return nil
   549  }
   550  
   551  func (u *Unmarshaler) fillSliceFromString(fieldType reflect.Type, value reflect.Value,
   552  	mapValue interface{}) error {
   553  	var slice []interface{}
   554  	switch v := mapValue.(type) {
   555  	case fmt.Stringer:
   556  		if err := jsonx.UnmarshalFromString(v.String(), &slice); err != nil {
   557  			return err
   558  		}
   559  	case string:
   560  		if err := jsonx.UnmarshalFromString(v, &slice); err != nil {
   561  			return err
   562  		}
   563  	default:
   564  		return errUnsupportedType
   565  	}
   566  
   567  	baseFieldType := Deref(fieldType.Elem())
   568  	baseFieldKind := baseFieldType.Kind()
   569  	conv := reflect.MakeSlice(reflect.SliceOf(baseFieldType), len(slice), cap(slice))
   570  
   571  	for i := 0; i < len(slice); i++ {
   572  		if err := u.fillSliceValue(conv, i, baseFieldKind, slice[i]); err != nil {
   573  			return err
   574  		}
   575  	}
   576  
   577  	value.Set(conv)
   578  	return nil
   579  }
   580  
   581  func (u *Unmarshaler) fillSliceValue(slice reflect.Value, index int,
   582  	baseKind reflect.Kind, value interface{}) error {
   583  	ithVal := slice.Index(index)
   584  	switch v := value.(type) {
   585  	case fmt.Stringer:
   586  		return setValue(baseKind, ithVal, v.String())
   587  	case string:
   588  		return setValue(baseKind, ithVal, v)
   589  	default:
   590  		// don't need to consider the difference between int, int8, int16, int32, int64,
   591  		// uint, uint8, uint16, uint32, uint64, because they're handled as json.Number.
   592  		if ithVal.Kind() == reflect.Ptr {
   593  			baseType := Deref(ithVal.Type())
   594  			if baseType.Kind() != reflect.TypeOf(value).Kind() {
   595  				return errTypeMismatch
   596  			}
   597  
   598  			target := reflect.New(baseType).Elem()
   599  			target.Set(reflect.ValueOf(value))
   600  			ithVal.Set(target.Addr())
   601  			return nil
   602  		}
   603  
   604  		if ithVal.Kind() != reflect.TypeOf(value).Kind() {
   605  			return errTypeMismatch
   606  		}
   607  
   608  		ithVal.Set(reflect.ValueOf(value))
   609  		return nil
   610  	}
   611  }
   612  
   613  func (u *Unmarshaler) fillSliceWithDefault(derefedType reflect.Type, value reflect.Value,
   614  	defaultValue string) error {
   615  	baseFieldType := Deref(derefedType.Elem())
   616  	baseFieldKind := baseFieldType.Kind()
   617  	defaultCacheLock.Lock()
   618  	slice, ok := defaultCache[defaultValue]
   619  	defaultCacheLock.Unlock()
   620  	if !ok {
   621  		if baseFieldKind == reflect.String {
   622  			slice = parseGroupedSegments(defaultValue)
   623  		} else if err := jsonx.UnmarshalFromString(defaultValue, &slice); err != nil {
   624  			return err
   625  		}
   626  
   627  		defaultCacheLock.Lock()
   628  		defaultCache[defaultValue] = slice
   629  		defaultCacheLock.Unlock()
   630  	}
   631  
   632  	return u.fillSlice(derefedType, value, slice)
   633  }
   634  
   635  func (u *Unmarshaler) generateMap(keyType, elemType reflect.Type, mapValue interface{}) (reflect.Value, error) {
   636  	mapType := reflect.MapOf(keyType, elemType)
   637  	valueType := reflect.TypeOf(mapValue)
   638  	if mapType == valueType {
   639  		return reflect.ValueOf(mapValue), nil
   640  	}
   641  
   642  	refValue := reflect.ValueOf(mapValue)
   643  	targetValue := reflect.MakeMapWithSize(mapType, refValue.Len())
   644  	fieldElemKind := elemType.Kind()
   645  	dereffedElemType := Deref(elemType)
   646  	dereffedElemKind := dereffedElemType.Kind()
   647  
   648  	for _, key := range refValue.MapKeys() {
   649  		keythValue := refValue.MapIndex(key)
   650  		keythData := keythValue.Interface()
   651  
   652  		switch dereffedElemKind {
   653  		case reflect.Slice:
   654  			target := reflect.New(dereffedElemType)
   655  			if err := u.fillSlice(elemType, target.Elem(), keythData); err != nil {
   656  				return emptyValue, err
   657  			}
   658  
   659  			targetValue.SetMapIndex(key, target.Elem())
   660  		case reflect.Struct:
   661  			keythMap, ok := keythData.(map[string]interface{})
   662  			if !ok {
   663  				return emptyValue, errTypeMismatch
   664  			}
   665  
   666  			target := reflect.New(dereffedElemType)
   667  			if err := u.Unmarshal(keythMap, target.Interface()); err != nil {
   668  				return emptyValue, err
   669  			}
   670  
   671  			if fieldElemKind == reflect.Ptr {
   672  				targetValue.SetMapIndex(key, target)
   673  			} else {
   674  				targetValue.SetMapIndex(key, target.Elem())
   675  			}
   676  		case reflect.Map:
   677  			keythMap, ok := keythData.(map[string]interface{})
   678  			if !ok {
   679  				return emptyValue, errTypeMismatch
   680  			}
   681  
   682  			innerValue, err := u.generateMap(elemType.Key(), elemType.Elem(), keythMap)
   683  			if err != nil {
   684  				return emptyValue, err
   685  			}
   686  
   687  			targetValue.SetMapIndex(key, innerValue)
   688  		default:
   689  			switch v := keythData.(type) {
   690  			case bool:
   691  				targetValue.SetMapIndex(key, reflect.ValueOf(v))
   692  			case string:
   693  				targetValue.SetMapIndex(key, reflect.ValueOf(v))
   694  			case json.Number:
   695  				target := reflect.New(dereffedElemType)
   696  				if err := setValue(dereffedElemKind, target.Elem(), v.String()); err != nil {
   697  					return emptyValue, err
   698  				}
   699  
   700  				targetValue.SetMapIndex(key, target.Elem())
   701  			default:
   702  				targetValue.SetMapIndex(key, keythValue)
   703  			}
   704  		}
   705  	}
   706  
   707  	return targetValue, nil
   708  }
   709  
   710  func (u *Unmarshaler) parseOptionsWithContext(field reflect.StructField, m Valuer, fullName string) (
   711  	string, *fieldOptionsWithContext, error) {
   712  	key, options, err := parseKeyAndOptions(u.key, field)
   713  	if err != nil {
   714  		return "", nil, err
   715  	} else if options == nil {
   716  		return key, nil, nil
   717  	}
   718  
   719  	optsWithContext, err := options.toOptionsWithContext(key, m, fullName)
   720  	if err != nil {
   721  		return "", nil, err
   722  	}
   723  
   724  	return key, optsWithContext, nil
   725  }
   726  
   727  // WithStringValues customizes an Unmarshaler with number values from strings.
   728  func WithStringValues() UnmarshalOption {
   729  	return func(opt *unmarshalOptions) {
   730  		opt.fromString = true
   731  	}
   732  }
   733  
   734  // WithCanonicalKeyFunc customizes an Unmarshaler with Canonical Key func
   735  func WithCanonicalKeyFunc(f func(string) string) UnmarshalOption {
   736  	return func(opt *unmarshalOptions) {
   737  		opt.canonicalKey = f
   738  	}
   739  }
   740  
   741  func fillDurationValue(fieldKind reflect.Kind, value reflect.Value, dur string) error {
   742  	d, err := time.ParseDuration(dur)
   743  	if err != nil {
   744  		return err
   745  	}
   746  
   747  	if fieldKind == reflect.Ptr {
   748  		value.Elem().Set(reflect.ValueOf(d))
   749  	} else {
   750  		value.Set(reflect.ValueOf(d))
   751  	}
   752  
   753  	return nil
   754  }
   755  
   756  func fillPrimitive(fieldType reflect.Type, value reflect.Value, mapValue interface{},
   757  	opts *fieldOptionsWithContext, fullName string) error {
   758  	if !value.CanSet() {
   759  		return errValueNotSettable
   760  	}
   761  
   762  	baseType := Deref(fieldType)
   763  	if fieldType.Kind() == reflect.Ptr {
   764  		target := reflect.New(baseType).Elem()
   765  		switch mapValue.(type) {
   766  		case string, json.Number:
   767  			value.Set(target.Addr())
   768  			value = target
   769  		}
   770  	}
   771  
   772  	switch v := mapValue.(type) {
   773  	case string:
   774  		return validateAndSetValue(baseType.Kind(), value, v, opts)
   775  	case json.Number:
   776  		if err := validateJsonNumberRange(v, opts); err != nil {
   777  			return err
   778  		}
   779  		return setValue(baseType.Kind(), value, v.String())
   780  	default:
   781  		return newTypeMismatchError(fullName)
   782  	}
   783  }
   784  
   785  func fillWithSameType(field reflect.StructField, value reflect.Value, mapValue interface{},
   786  	opts *fieldOptionsWithContext) error {
   787  	if !value.CanSet() {
   788  		return errValueNotSettable
   789  	}
   790  
   791  	if err := validateValueRange(mapValue, opts); err != nil {
   792  		return err
   793  	}
   794  
   795  	if field.Type.Kind() == reflect.Ptr {
   796  		baseType := Deref(field.Type)
   797  		target := reflect.New(baseType).Elem()
   798  		setSameKindValue(baseType, target, mapValue)
   799  		value.Set(target.Addr())
   800  	} else {
   801  		setSameKindValue(field.Type, value, mapValue)
   802  	}
   803  
   804  	return nil
   805  }
   806  
   807  // getValue gets the value for the specific key, the key can be in the format of parentKey.childKey
   808  func getValue(m Valuer, key string) (interface{}, bool) {
   809  	keys := readKeys(key)
   810  	return getValueWithChainedKeys(m, keys)
   811  }
   812  
   813  func getValueWithChainedKeys(m Valuer, keys []string) (interface{}, bool) {
   814  	if len(keys) == 1 {
   815  		v, ok := m.Value(keys[0])
   816  		return v, ok
   817  	}
   818  
   819  	if len(keys) > 1 {
   820  		if v, ok := m.Value(keys[0]); ok {
   821  			if nextm, ok := v.(map[string]interface{}); ok {
   822  				return getValueWithChainedKeys(MapValuer(nextm), keys[1:])
   823  			}
   824  		}
   825  	}
   826  
   827  	return nil, false
   828  }
   829  
   830  func join(elem ...string) string {
   831  	var builder strings.Builder
   832  
   833  	var fillSep bool
   834  	for _, e := range elem {
   835  		if len(e) == 0 {
   836  			continue
   837  		}
   838  
   839  		if fillSep {
   840  			builder.WriteByte(delimiter)
   841  		} else {
   842  			fillSep = true
   843  		}
   844  
   845  		builder.WriteString(e)
   846  	}
   847  
   848  	return builder.String()
   849  }
   850  
   851  func newInitError(name string) error {
   852  	return fmt.Errorf("field %s is not set", name)
   853  }
   854  
   855  func newTypeMismatchError(name string) error {
   856  	return fmt.Errorf("error: type mismatch for field %s", name)
   857  }
   858  
   859  func readKeys(key string) []string {
   860  	cacheKeysLock.Lock()
   861  	keys, ok := cacheKeys[key]
   862  	cacheKeysLock.Unlock()
   863  	if ok {
   864  		return keys
   865  	}
   866  
   867  	keys = strings.FieldsFunc(key, func(c rune) bool {
   868  		return c == delimiter
   869  	})
   870  	cacheKeysLock.Lock()
   871  	cacheKeys[key] = keys
   872  	cacheKeysLock.Unlock()
   873  
   874  	return keys
   875  }
   876  
   877  func setSameKindValue(targetType reflect.Type, target reflect.Value, value interface{}) {
   878  	if reflect.ValueOf(value).Type().AssignableTo(targetType) {
   879  		target.Set(reflect.ValueOf(value))
   880  	} else {
   881  		target.Set(reflect.ValueOf(value).Convert(targetType))
   882  	}
   883  }