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 }