Skip to content

Commit 25784d1

Browse files
author
dapeng
committed
refactor(config): improve type handling and error management
- Introduce UnsupportedError for better error handling - Deprecate SetValue and rename to SetPointerValue for clarity - Rename setValueByReflectValue to SetValueByReflect for consistency- Update related test cases
1 parent de21e86 commit 25784d1

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

config.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gone
22

33
import (
44
"encoding/json"
5+
"errors"
56
"os"
67
"reflect"
78
"strconv"
@@ -113,7 +114,24 @@ func (s *EnvConfigure) Get(key string, v any, defaultVal string) error {
113114
return SetValue(rv, v, env)
114115
}
115116

117+
var UnsupportedError = NewInnerError("Unsupported type by EnvConfigure", ConfigError)
118+
119+
// SetValue sets the value of a pointer to a Go type based on the provided value and environment variable.
120+
// Deprecated use SetPointerValue or SetValueByReflect instead
116121
func SetValue(rv reflect.Value, v any, value string) error {
122+
err := SetPointerValue(v, value)
123+
if err != nil {
124+
if errors.Is(err, UnsupportedError) {
125+
return SetValueByReflect(rv, value)
126+
} else {
127+
return ToError(err)
128+
}
129+
}
130+
return nil
131+
}
132+
133+
// SetPointerValue sets the value of a pointer to a Go type based on the provided value and environment variable.
134+
func SetPointerValue(v any, value string) error {
117135
// Type switch to handle different pointer types
118136
switch ptr := v.(type) {
119137
// String type
@@ -215,16 +233,17 @@ func SetValue(rv reflect.Value, v any, value string) error {
215233
*ptr = val
216234

217235
default:
218-
return setValueByReflectValue(rv, v, value)
236+
return UnsupportedError
219237
}
220238
return nil
221239
}
222240

223-
func setValueByReflectValue(rv reflect.Value, v any, value string) error {
241+
// SetValueByReflect sets the value of a pointer to a Go type based on the provided value and environment variable.
242+
func SetValueByReflect(rv reflect.Value, value string) error {
224243
k := rv.Elem().Kind()
225244
switch k {
226245
case reflect.Struct, reflect.Slice, reflect.Map:
227-
return ToError(json.Unmarshal([]byte(value), v))
246+
return ToError(json.Unmarshal([]byte(value), rv.Interface()))
228247
case reflect.String:
229248
rv.Elem().SetString(value)
230249
case reflect.Int:
@@ -310,8 +329,7 @@ func setValueByReflectValue(rv reflect.Value, v any, value string) error {
310329
rv.Elem().SetBool(val)
311330

312331
default:
313-
// Struct and unsupported types
314-
return NewInnerError("Unsupported type by EnvConfigure", ConfigError)
332+
return UnsupportedError
315333
}
316334
return nil
317335
}

config_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ func TestSetValueByReflectValue(t *testing.T) {
555555
for _, tt := range tests {
556556
t.Run(tt.name, func(t *testing.T) {
557557
rv := reflect.ValueOf(tt.value)
558-
err := setValueByReflectValue(rv, tt.value, tt.strVal)
558+
err := SetValueByReflect(rv, tt.strVal)
559559
if (err != nil) != tt.wantErr {
560560
t.Errorf("setValueByReflectValue() error = %v, wantErr %v", err, tt.wantErr)
561561
return

0 commit comments

Comments
 (0)