From 95d5b81f44230f72fa6eefc1a183a5d03bc8e6f5 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Wed, 9 Jul 2025 23:55:24 +0800 Subject: [PATCH] chore: optimize pr 4979 (#4988) Signed-off-by: kevin --- core/mapping/unmarshaler.go | 16 +++++++++------- core/mapping/unmarshaler_test.go | 29 +++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index 2dffb788e..48deb9b7c 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -30,7 +30,9 @@ var ( errValueNotSettable = errors.New("value is not settable") errValueNotStruct = errors.New("value type is not struct") keyUnmarshaler = NewUnmarshaler(defaultKeyName) + boolType = reflect.TypeOf(false) durationType = reflect.TypeOf(time.Duration(0)) + stringType = reflect.TypeOf("") cacheKeys = make(map[string][]string) cacheKeysLock sync.Mutex defaultCache = make(map[string]any) @@ -765,24 +767,24 @@ func (u *Unmarshaler) processFieldWithEnvValue(fieldType reflect.Type, value ref return err } - fieldKind := fieldType.Kind() - switch true { - case fieldKind == reflect.Bool: + derefType := Deref(fieldType) + switch derefType { + case boolType: val, err := strconv.ParseBool(envVal) if err != nil { return fmt.Errorf("unmarshal field %q with environment variable, %w", fullName, err) } - value.SetBool(val) + SetValue(fieldType, value, reflect.ValueOf(val)) return nil - case fieldType == durationType: + case durationType: if err := fillDurationValue(fieldType, value, envVal); err != nil { return fmt.Errorf("unmarshal field %q with environment variable, %w", fullName, err) } return nil - case fieldKind == reflect.String: - value.SetString(envVal) + case stringType: + SetValue(fieldType, value, reflect.ValueOf(envVal)) return nil default: return u.processFieldPrimitiveWithJSONNumber(fieldType, value, json.Number(envVal), opts, fullName) diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index 95f58ae2d..54f342c62 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -4801,20 +4801,33 @@ func TestUnmarshal_EnvBoolBad(t *testing.T) { } func TestUnmarshal_EnvDuration(t *testing.T) { - type Value struct { - Duration time.Duration `key:"duration,env=TEST_NAME_DURATION"` - } - const ( envName = "TEST_NAME_DURATION" envVal = "1s" ) t.Setenv(envName, envVal) - var v Value - if assert.NoError(t, UnmarshalKey(emptyMap, &v)) { - assert.Equal(t, time.Second, v.Duration) - } + t.Run("valid duration", func(t *testing.T) { + type Value struct { + Duration time.Duration `key:"duration,env=TEST_NAME_DURATION"` + } + + var v Value + if assert.NoError(t, UnmarshalKey(emptyMap, &v)) { + assert.Equal(t, time.Second, v.Duration) + } + }) + + t.Run("ptr of duration", func(t *testing.T) { + type Value struct { + Duration *time.Duration `key:"duration,env=TEST_NAME_DURATION"` + } + + var v Value + if assert.NoError(t, UnmarshalKey(emptyMap, &v)) { + assert.Equal(t, time.Second, *v.Duration) + } + }) } func TestUnmarshal_EnvDurationBadValue(t *testing.T) {