github.com/lingyao2333/mo-zero@v1.4.1/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/lingyao2333/mo-zero/core/jsonx"
    14  	"github.com/lingyao2333/mo-zero/core/lang"
    15  	"github.com/lingyao2333/mo-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(simpleValuer{current: m}, v, "")
    79  }
    80  
    81  func (u *Unmarshaler) unmarshalWithFullName(m valuerWithParent, 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 valuerWithParent, 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 valuerWithParent, 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 valuerWithParent, 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,
   179  	m valuerWithParent, 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  	vp valueWithParent, opts *fieldOptionsWithContext, fullName string) error {
   193  	fieldType := field.Type
   194  	derefedFieldType := Deref(fieldType)
   195  	typeKind := derefedFieldType.Kind()
   196  	valueKind := reflect.TypeOf(vp.value).Kind()
   197  	mapValue := vp.value
   198  
   199  	switch {
   200  	case valueKind == reflect.Map && typeKind == reflect.Struct:
   201  		if mv, ok := mapValue.(map[string]interface{}); ok {
   202  			return u.processFieldStruct(field, value, &simpleValuer{
   203  				current: mapValuer(mv),
   204  				parent:  vp.parent,
   205  			}, fullName)
   206  		} else {
   207  			return errTypeMismatch
   208  		}
   209  	case valueKind == reflect.Map && typeKind == reflect.Map:
   210  		return u.fillMap(field, value, mapValue)
   211  	case valueKind == reflect.String && typeKind == reflect.Map:
   212  		return u.fillMapFromString(value, mapValue)
   213  	case valueKind == reflect.String && typeKind == reflect.Slice:
   214  		return u.fillSliceFromString(fieldType, value, mapValue)
   215  	case valueKind == reflect.String && derefedFieldType == durationType:
   216  		return fillDurationValue(fieldType.Kind(), value, mapValue.(string))
   217  	default:
   218  		return u.processFieldPrimitive(field, value, mapValue, opts, fullName)
   219  	}
   220  }
   221  
   222  func (u *Unmarshaler) processFieldPrimitive(field reflect.StructField, value reflect.Value,
   223  	mapValue interface{}, opts *fieldOptionsWithContext, fullName string) error {
   224  	fieldType := field.Type
   225  	typeKind := Deref(fieldType).Kind()
   226  	valueKind := reflect.TypeOf(mapValue).Kind()
   227  
   228  	switch {
   229  	case typeKind == reflect.Slice && valueKind == reflect.Slice:
   230  		return u.fillSlice(fieldType, value, mapValue)
   231  	case typeKind == reflect.Map && valueKind == reflect.Map:
   232  		return u.fillMap(field, value, mapValue)
   233  	default:
   234  		switch v := mapValue.(type) {
   235  		case json.Number:
   236  			return u.processFieldPrimitiveWithJSONNumber(field, value, v, opts, fullName)
   237  		default:
   238  			if typeKind == valueKind {
   239  				if err := validateValueInOptions(mapValue, opts.options()); err != nil {
   240  					return err
   241  				}
   242  
   243  				return fillWithSameType(field, value, mapValue, opts)
   244  			}
   245  		}
   246  	}
   247  
   248  	return newTypeMismatchError(fullName)
   249  }
   250  
   251  func (u *Unmarshaler) processFieldPrimitiveWithJSONNumber(field reflect.StructField, value reflect.Value,
   252  	v json.Number, opts *fieldOptionsWithContext, fullName string) error {
   253  	fieldType := field.Type
   254  	fieldKind := fieldType.Kind()
   255  	typeKind := Deref(fieldType).Kind()
   256  
   257  	if err := validateJsonNumberRange(v, opts); err != nil {
   258  		return err
   259  	}
   260  
   261  	if err := validateValueInOptions(v, opts.options()); err != nil {
   262  		return err
   263  	}
   264  
   265  	if fieldKind == reflect.Ptr {
   266  		value = value.Elem()
   267  	}
   268  
   269  	switch typeKind {
   270  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   271  		iValue, err := v.Int64()
   272  		if err != nil {
   273  			return err
   274  		}
   275  
   276  		value.SetInt(iValue)
   277  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
   278  		iValue, err := v.Int64()
   279  		if err != nil {
   280  			return err
   281  		}
   282  
   283  		if iValue < 0 {
   284  			return fmt.Errorf("unmarshal %q with bad value %q", fullName, v.String())
   285  		}
   286  
   287  		value.SetUint(uint64(iValue))
   288  	case reflect.Float32, reflect.Float64:
   289  		fValue, err := v.Float64()
   290  		if err != nil {
   291  			return err
   292  		}
   293  
   294  		value.SetFloat(fValue)
   295  	default:
   296  		return newTypeMismatchError(fullName)
   297  	}
   298  
   299  	return nil
   300  }
   301  
   302  func (u *Unmarshaler) processFieldStruct(field reflect.StructField, value reflect.Value,
   303  	m valuerWithParent, fullName string) error {
   304  	if field.Type.Kind() == reflect.Ptr {
   305  		baseType := Deref(field.Type)
   306  		target := reflect.New(baseType).Elem()
   307  		if err := u.unmarshalWithFullName(m, target.Addr().Interface(), fullName); err != nil {
   308  			return err
   309  		}
   310  
   311  		value.Set(target.Addr())
   312  	} else if err := u.unmarshalWithFullName(m, value.Addr().Interface(), fullName); err != nil {
   313  		return err
   314  	}
   315  
   316  	return nil
   317  }
   318  
   319  func (u *Unmarshaler) processFieldTextUnmarshaler(field reflect.StructField, value reflect.Value,
   320  	mapValue interface{}) (bool, error) {
   321  	var tval encoding.TextUnmarshaler
   322  	var ok bool
   323  
   324  	if field.Type.Kind() == reflect.Ptr {
   325  		tval, ok = value.Interface().(encoding.TextUnmarshaler)
   326  	} else {
   327  		tval, ok = value.Addr().Interface().(encoding.TextUnmarshaler)
   328  	}
   329  	if ok {
   330  		switch mv := mapValue.(type) {
   331  		case string:
   332  			return true, tval.UnmarshalText([]byte(mv))
   333  		case []byte:
   334  			return true, tval.UnmarshalText(mv)
   335  		}
   336  	}
   337  
   338  	return false, nil
   339  }
   340  
   341  func (u *Unmarshaler) processNamedField(field reflect.StructField, value reflect.Value,
   342  	m valuerWithParent, fullName string) error {
   343  	key, opts, err := u.parseOptionsWithContext(field, m, fullName)
   344  	if err != nil {
   345  		return err
   346  	}
   347  
   348  	fullName = join(fullName, key)
   349  	canonicalKey := key
   350  	if u.opts.canonicalKey != nil {
   351  		canonicalKey = u.opts.canonicalKey(key)
   352  	}
   353  
   354  	valuer := createValuer(m, opts)
   355  	mapValue, hasValue := getValue(valuer, canonicalKey)
   356  	if !hasValue {
   357  		return u.processNamedFieldWithoutValue(field, value, opts, fullName)
   358  	}
   359  
   360  	return u.processNamedFieldWithValue(field, value, valueWithParent{
   361  		value:  mapValue,
   362  		parent: valuer,
   363  	}, key, opts, fullName)
   364  }
   365  
   366  func (u *Unmarshaler) processNamedFieldWithValue(field reflect.StructField, value reflect.Value,
   367  	vp valueWithParent, key string, opts *fieldOptionsWithContext, fullName string) error {
   368  	mapValue := vp.value
   369  	if mapValue == nil {
   370  		if opts.optional() {
   371  			return nil
   372  		}
   373  
   374  		return fmt.Errorf("field %s mustn't be nil", key)
   375  	}
   376  
   377  	if !value.CanSet() {
   378  		return fmt.Errorf("field %s is not settable", key)
   379  	}
   380  
   381  	maybeNewValue(field, value)
   382  
   383  	if yes, err := u.processFieldTextUnmarshaler(field, value, mapValue); yes {
   384  		return err
   385  	}
   386  
   387  	fieldKind := Deref(field.Type).Kind()
   388  	switch fieldKind {
   389  	case reflect.Array, reflect.Map, reflect.Slice, reflect.Struct:
   390  		return u.processFieldNotFromString(field, value, vp, opts, fullName)
   391  	default:
   392  		if u.opts.fromString || opts.fromString() {
   393  			valueKind := reflect.TypeOf(mapValue).Kind()
   394  			if valueKind != reflect.String {
   395  				return fmt.Errorf("error: the value in map is not string, but %s", valueKind)
   396  			}
   397  
   398  			options := opts.options()
   399  			if len(options) > 0 {
   400  				if !stringx.Contains(options, mapValue.(string)) {
   401  					return fmt.Errorf(`error: value "%s" for field "%s" is not defined in options "%v"`,
   402  						mapValue, key, options)
   403  				}
   404  			}
   405  
   406  			return fillPrimitive(field.Type, value, mapValue, opts, fullName)
   407  		}
   408  
   409  		return u.processFieldNotFromString(field, value, vp, opts, fullName)
   410  	}
   411  }
   412  
   413  func (u *Unmarshaler) processNamedFieldWithoutValue(field reflect.StructField, value reflect.Value,
   414  	opts *fieldOptionsWithContext, fullName string) error {
   415  	derefedType := Deref(field.Type)
   416  	fieldKind := derefedType.Kind()
   417  	if defaultValue, ok := opts.getDefault(); ok {
   418  		if field.Type.Kind() == reflect.Ptr {
   419  			maybeNewValue(field, value)
   420  			value = value.Elem()
   421  		}
   422  		if derefedType == durationType {
   423  			return fillDurationValue(fieldKind, value, defaultValue)
   424  		}
   425  
   426  		switch fieldKind {
   427  		case reflect.Array, reflect.Slice:
   428  			return u.fillSliceWithDefault(derefedType, value, defaultValue)
   429  		default:
   430  			return setValue(fieldKind, value, defaultValue)
   431  		}
   432  	}
   433  
   434  	switch fieldKind {
   435  	case reflect.Array, reflect.Map, reflect.Slice:
   436  		if !opts.optional() {
   437  			return u.processFieldNotFromString(field, value, valueWithParent{
   438  				value: emptyMap,
   439  			}, opts, fullName)
   440  		}
   441  	case reflect.Struct:
   442  		if !opts.optional() {
   443  			required, err := structValueRequired(u.key, derefedType)
   444  			if err != nil {
   445  				return err
   446  			}
   447  
   448  			if required {
   449  				return fmt.Errorf("%q is not set", fullName)
   450  			}
   451  
   452  			return u.processFieldNotFromString(field, value, valueWithParent{
   453  				value: emptyMap,
   454  			}, opts, fullName)
   455  		}
   456  	default:
   457  		if !opts.optional() {
   458  			return newInitError(fullName)
   459  		}
   460  	}
   461  
   462  	return nil
   463  }
   464  
   465  func (u *Unmarshaler) fillMap(field reflect.StructField, value reflect.Value, mapValue interface{}) error {
   466  	if !value.CanSet() {
   467  		return errValueNotSettable
   468  	}
   469  
   470  	fieldKeyType := field.Type.Key()
   471  	fieldElemType := field.Type.Elem()
   472  	targetValue, err := u.generateMap(fieldKeyType, fieldElemType, mapValue)
   473  	if err != nil {
   474  		return err
   475  	}
   476  
   477  	value.Set(targetValue)
   478  	return nil
   479  }
   480  
   481  func (u *Unmarshaler) fillMapFromString(value reflect.Value, mapValue interface{}) error {
   482  	if !value.CanSet() {
   483  		return errValueNotSettable
   484  	}
   485  
   486  	switch v := mapValue.(type) {
   487  	case fmt.Stringer:
   488  		if err := jsonx.UnmarshalFromString(v.String(), value.Addr().Interface()); err != nil {
   489  			return err
   490  		}
   491  	case string:
   492  		if err := jsonx.UnmarshalFromString(v, value.Addr().Interface()); err != nil {
   493  			return err
   494  		}
   495  	default:
   496  		return errUnsupportedType
   497  	}
   498  
   499  	return nil
   500  }
   501  
   502  func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value, mapValue interface{}) error {
   503  	if !value.CanSet() {
   504  		return errValueNotSettable
   505  	}
   506  
   507  	baseType := fieldType.Elem()
   508  	baseKind := baseType.Kind()
   509  	dereffedBaseType := Deref(baseType)
   510  	dereffedBaseKind := dereffedBaseType.Kind()
   511  	refValue := reflect.ValueOf(mapValue)
   512  	if refValue.IsNil() {
   513  		return nil
   514  	}
   515  
   516  	conv := reflect.MakeSlice(reflect.SliceOf(baseType), refValue.Len(), refValue.Cap())
   517  	if refValue.Len() == 0 {
   518  		value.Set(conv)
   519  		return nil
   520  	}
   521  
   522  	var valid bool
   523  	for i := 0; i < refValue.Len(); i++ {
   524  		ithValue := refValue.Index(i).Interface()
   525  		if ithValue == nil {
   526  			continue
   527  		}
   528  
   529  		valid = true
   530  		switch dereffedBaseKind {
   531  		case reflect.Struct:
   532  			target := reflect.New(dereffedBaseType)
   533  			if err := u.Unmarshal(ithValue.(map[string]interface{}), target.Interface()); err != nil {
   534  				return err
   535  			}
   536  
   537  			if baseKind == reflect.Ptr {
   538  				conv.Index(i).Set(target)
   539  			} else {
   540  				conv.Index(i).Set(target.Elem())
   541  			}
   542  		case reflect.Slice:
   543  			if err := u.fillSlice(dereffedBaseType, conv.Index(i), ithValue); err != nil {
   544  				return err
   545  			}
   546  		default:
   547  			if err := u.fillSliceValue(conv, i, dereffedBaseKind, ithValue); err != nil {
   548  				return err
   549  			}
   550  		}
   551  	}
   552  
   553  	if valid {
   554  		value.Set(conv)
   555  	}
   556  
   557  	return nil
   558  }
   559  
   560  func (u *Unmarshaler) fillSliceFromString(fieldType reflect.Type, value reflect.Value,
   561  	mapValue interface{}) error {
   562  	var slice []interface{}
   563  	switch v := mapValue.(type) {
   564  	case fmt.Stringer:
   565  		if err := jsonx.UnmarshalFromString(v.String(), &slice); err != nil {
   566  			return err
   567  		}
   568  	case string:
   569  		if err := jsonx.UnmarshalFromString(v, &slice); err != nil {
   570  			return err
   571  		}
   572  	default:
   573  		return errUnsupportedType
   574  	}
   575  
   576  	baseFieldType := Deref(fieldType.Elem())
   577  	baseFieldKind := baseFieldType.Kind()
   578  	conv := reflect.MakeSlice(reflect.SliceOf(baseFieldType), len(slice), cap(slice))
   579  
   580  	for i := 0; i < len(slice); i++ {
   581  		if err := u.fillSliceValue(conv, i, baseFieldKind, slice[i]); err != nil {
   582  			return err
   583  		}
   584  	}
   585  
   586  	value.Set(conv)
   587  	return nil
   588  }
   589  
   590  func (u *Unmarshaler) fillSliceValue(slice reflect.Value, index int,
   591  	baseKind reflect.Kind, value interface{}) error {
   592  	ithVal := slice.Index(index)
   593  	switch v := value.(type) {
   594  	case fmt.Stringer:
   595  		return setValue(baseKind, ithVal, v.String())
   596  	case string:
   597  		return setValue(baseKind, ithVal, v)
   598  	default:
   599  		// don't need to consider the difference between int, int8, int16, int32, int64,
   600  		// uint, uint8, uint16, uint32, uint64, because they're handled as json.Number.
   601  		if ithVal.Kind() == reflect.Ptr {
   602  			baseType := Deref(ithVal.Type())
   603  			if baseType.Kind() != reflect.TypeOf(value).Kind() {
   604  				return errTypeMismatch
   605  			}
   606  
   607  			target := reflect.New(baseType).Elem()
   608  			target.Set(reflect.ValueOf(value))
   609  			ithVal.Set(target.Addr())
   610  			return nil
   611  		}
   612  
   613  		if ithVal.Kind() != reflect.TypeOf(value).Kind() {
   614  			return errTypeMismatch
   615  		}
   616  
   617  		ithVal.Set(reflect.ValueOf(value))
   618  		return nil
   619  	}
   620  }
   621  
   622  func (u *Unmarshaler) fillSliceWithDefault(derefedType reflect.Type, value reflect.Value,
   623  	defaultValue string) error {
   624  	baseFieldType := Deref(derefedType.Elem())
   625  	baseFieldKind := baseFieldType.Kind()
   626  	defaultCacheLock.Lock()
   627  	slice, ok := defaultCache[defaultValue]
   628  	defaultCacheLock.Unlock()
   629  	if !ok {
   630  		if baseFieldKind == reflect.String {
   631  			slice = parseGroupedSegments(defaultValue)
   632  		} else if err := jsonx.UnmarshalFromString(defaultValue, &slice); err != nil {
   633  			return err
   634  		}
   635  
   636  		defaultCacheLock.Lock()
   637  		defaultCache[defaultValue] = slice
   638  		defaultCacheLock.Unlock()
   639  	}
   640  
   641  	return u.fillSlice(derefedType, value, slice)
   642  }
   643  
   644  func (u *Unmarshaler) generateMap(keyType, elemType reflect.Type, mapValue interface{}) (reflect.Value, error) {
   645  	mapType := reflect.MapOf(keyType, elemType)
   646  	valueType := reflect.TypeOf(mapValue)
   647  	if mapType == valueType {
   648  		return reflect.ValueOf(mapValue), nil
   649  	}
   650  
   651  	refValue := reflect.ValueOf(mapValue)
   652  	targetValue := reflect.MakeMapWithSize(mapType, refValue.Len())
   653  	fieldElemKind := elemType.Kind()
   654  	dereffedElemType := Deref(elemType)
   655  	dereffedElemKind := dereffedElemType.Kind()
   656  
   657  	for _, key := range refValue.MapKeys() {
   658  		keythValue := refValue.MapIndex(key)
   659  		keythData := keythValue.Interface()
   660  
   661  		switch dereffedElemKind {
   662  		case reflect.Slice:
   663  			target := reflect.New(dereffedElemType)
   664  			if err := u.fillSlice(elemType, target.Elem(), keythData); err != nil {
   665  				return emptyValue, err
   666  			}
   667  
   668  			targetValue.SetMapIndex(key, target.Elem())
   669  		case reflect.Struct:
   670  			keythMap, ok := keythData.(map[string]interface{})
   671  			if !ok {
   672  				return emptyValue, errTypeMismatch
   673  			}
   674  
   675  			target := reflect.New(dereffedElemType)
   676  			if err := u.Unmarshal(keythMap, target.Interface()); err != nil {
   677  				return emptyValue, err
   678  			}
   679  
   680  			if fieldElemKind == reflect.Ptr {
   681  				targetValue.SetMapIndex(key, target)
   682  			} else {
   683  				targetValue.SetMapIndex(key, target.Elem())
   684  			}
   685  		case reflect.Map:
   686  			keythMap, ok := keythData.(map[string]interface{})
   687  			if !ok {
   688  				return emptyValue, errTypeMismatch
   689  			}
   690  
   691  			innerValue, err := u.generateMap(elemType.Key(), elemType.Elem(), keythMap)
   692  			if err != nil {
   693  				return emptyValue, err
   694  			}
   695  
   696  			targetValue.SetMapIndex(key, innerValue)
   697  		default:
   698  			switch v := keythData.(type) {
   699  			case bool:
   700  				targetValue.SetMapIndex(key, reflect.ValueOf(v))
   701  			case string:
   702  				targetValue.SetMapIndex(key, reflect.ValueOf(v))
   703  			case json.Number:
   704  				target := reflect.New(dereffedElemType)
   705  				if err := setValue(dereffedElemKind, target.Elem(), v.String()); err != nil {
   706  					return emptyValue, err
   707  				}
   708  
   709  				targetValue.SetMapIndex(key, target.Elem())
   710  			default:
   711  				targetValue.SetMapIndex(key, keythValue)
   712  			}
   713  		}
   714  	}
   715  
   716  	return targetValue, nil
   717  }
   718  
   719  func (u *Unmarshaler) parseOptionsWithContext(field reflect.StructField, m Valuer, fullName string) (
   720  	string, *fieldOptionsWithContext, error) {
   721  	key, options, err := parseKeyAndOptions(u.key, field)
   722  	if err != nil {
   723  		return "", nil, err
   724  	} else if options == nil {
   725  		return key, nil, nil
   726  	}
   727  
   728  	optsWithContext, err := options.toOptionsWithContext(key, m, fullName)
   729  	if err != nil {
   730  		return "", nil, err
   731  	}
   732  
   733  	return key, optsWithContext, nil
   734  }
   735  
   736  // WithStringValues customizes an Unmarshaler with number values from strings.
   737  func WithStringValues() UnmarshalOption {
   738  	return func(opt *unmarshalOptions) {
   739  		opt.fromString = true
   740  	}
   741  }
   742  
   743  // WithCanonicalKeyFunc customizes an Unmarshaler with Canonical Key func
   744  func WithCanonicalKeyFunc(f func(string) string) UnmarshalOption {
   745  	return func(opt *unmarshalOptions) {
   746  		opt.canonicalKey = f
   747  	}
   748  }
   749  
   750  func createValuer(v valuerWithParent, opts *fieldOptionsWithContext) valuerWithParent {
   751  	if opts.inherit() {
   752  		return recursiveValuer{
   753  			current: v,
   754  			parent:  v.Parent(),
   755  		}
   756  	}
   757  
   758  	return simpleValuer{
   759  		current: v,
   760  		parent:  v.Parent(),
   761  	}
   762  }
   763  
   764  func fillDurationValue(fieldKind reflect.Kind, value reflect.Value, dur string) error {
   765  	d, err := time.ParseDuration(dur)
   766  	if err != nil {
   767  		return err
   768  	}
   769  
   770  	if fieldKind == reflect.Ptr {
   771  		value.Elem().Set(reflect.ValueOf(d))
   772  	} else {
   773  		value.Set(reflect.ValueOf(d))
   774  	}
   775  
   776  	return nil
   777  }
   778  
   779  func fillPrimitive(fieldType reflect.Type, value reflect.Value, mapValue interface{},
   780  	opts *fieldOptionsWithContext, fullName string) error {
   781  	if !value.CanSet() {
   782  		return errValueNotSettable
   783  	}
   784  
   785  	baseType := Deref(fieldType)
   786  	if fieldType.Kind() == reflect.Ptr {
   787  		target := reflect.New(baseType).Elem()
   788  		switch mapValue.(type) {
   789  		case string, json.Number:
   790  			value.Set(target.Addr())
   791  			value = target
   792  		}
   793  	}
   794  
   795  	switch v := mapValue.(type) {
   796  	case string:
   797  		return validateAndSetValue(baseType.Kind(), value, v, opts)
   798  	case json.Number:
   799  		if err := validateJsonNumberRange(v, opts); err != nil {
   800  			return err
   801  		}
   802  		return setValue(baseType.Kind(), value, v.String())
   803  	default:
   804  		return newTypeMismatchError(fullName)
   805  	}
   806  }
   807  
   808  func fillWithSameType(field reflect.StructField, value reflect.Value, mapValue interface{},
   809  	opts *fieldOptionsWithContext) error {
   810  	if !value.CanSet() {
   811  		return errValueNotSettable
   812  	}
   813  
   814  	if err := validateValueRange(mapValue, opts); err != nil {
   815  		return err
   816  	}
   817  
   818  	if field.Type.Kind() == reflect.Ptr {
   819  		baseType := Deref(field.Type)
   820  		target := reflect.New(baseType).Elem()
   821  		setSameKindValue(baseType, target, mapValue)
   822  		value.Set(target.Addr())
   823  	} else {
   824  		setSameKindValue(field.Type, value, mapValue)
   825  	}
   826  
   827  	return nil
   828  }
   829  
   830  // getValue gets the value for the specific key, the key can be in the format of parentKey.childKey
   831  func getValue(m valuerWithParent, key string) (interface{}, bool) {
   832  	keys := readKeys(key)
   833  	return getValueWithChainedKeys(m, keys)
   834  }
   835  
   836  func getValueWithChainedKeys(m valuerWithParent, keys []string) (interface{}, bool) {
   837  	switch len(keys) {
   838  	case 0:
   839  		return nil, false
   840  	case 1:
   841  		v, ok := m.Value(keys[0])
   842  		return v, ok
   843  	default:
   844  		if v, ok := m.Value(keys[0]); ok {
   845  			if nextm, ok := v.(map[string]interface{}); ok {
   846  				return getValueWithChainedKeys(recursiveValuer{
   847  					current: mapValuer(nextm),
   848  					parent:  m,
   849  				}, keys[1:])
   850  			}
   851  		}
   852  
   853  		return nil, false
   854  	}
   855  }
   856  
   857  func join(elem ...string) string {
   858  	var builder strings.Builder
   859  
   860  	var fillSep bool
   861  	for _, e := range elem {
   862  		if len(e) == 0 {
   863  			continue
   864  		}
   865  
   866  		if fillSep {
   867  			builder.WriteByte(delimiter)
   868  		} else {
   869  			fillSep = true
   870  		}
   871  
   872  		builder.WriteString(e)
   873  	}
   874  
   875  	return builder.String()
   876  }
   877  
   878  func newInitError(name string) error {
   879  	return fmt.Errorf("field %s is not set", name)
   880  }
   881  
   882  func newTypeMismatchError(name string) error {
   883  	return fmt.Errorf("error: type mismatch for field %s", name)
   884  }
   885  
   886  func readKeys(key string) []string {
   887  	cacheKeysLock.Lock()
   888  	keys, ok := cacheKeys[key]
   889  	cacheKeysLock.Unlock()
   890  	if ok {
   891  		return keys
   892  	}
   893  
   894  	keys = strings.FieldsFunc(key, func(c rune) bool {
   895  		return c == delimiter
   896  	})
   897  	cacheKeysLock.Lock()
   898  	cacheKeys[key] = keys
   899  	cacheKeysLock.Unlock()
   900  
   901  	return keys
   902  }
   903  
   904  func setSameKindValue(targetType reflect.Type, target reflect.Value, value interface{}) {
   905  	if reflect.ValueOf(value).Type().AssignableTo(targetType) {
   906  		target.Set(reflect.ValueOf(value))
   907  	} else {
   908  		target.Set(reflect.ValueOf(value).Convert(targetType))
   909  	}
   910  }