拆开文件夹
This commit is contained in:
+109
@@ -0,0 +1,109 @@
|
||||
package structx
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// ValueSetter 值设置器接口
|
||||
type ValueSetter interface {
|
||||
SetFieldValue(field reflect.Value, value string) (interface{}, error)
|
||||
SetSliceElementValue(elemValue reflect.Value, item interface{}, elemType reflect.Type) error
|
||||
}
|
||||
|
||||
// defaultValueSetter 默认值设置器
|
||||
type defaultValueSetter struct{}
|
||||
|
||||
func (ds *defaultValueSetter) SetFieldValue(field reflect.Value, value string) (interface{}, error) {
|
||||
fieldType := field.Type()
|
||||
|
||||
if hasUnmarshalJSON(fieldType) {
|
||||
if err := setUnmarshalJSONValue(field, value); err != nil {
|
||||
return nil, fmt.Errorf("UnmarshalJSON失败: %w", err)
|
||||
}
|
||||
return field.Interface(), nil
|
||||
}
|
||||
|
||||
if hasUnmarshalText(fieldType) {
|
||||
if err := setUnmarshalTextValue(field, value); err != nil {
|
||||
return nil, fmt.Errorf("UnmarshalText失败: %w", err)
|
||||
}
|
||||
return field.Interface(), nil
|
||||
}
|
||||
|
||||
if fieldType.Kind() == reflect.Ptr {
|
||||
return setPointerFieldValue(field, value)
|
||||
}
|
||||
|
||||
if isTypeAlias(fieldType) {
|
||||
return setTypeAliasValue(field, value)
|
||||
}
|
||||
|
||||
if isCustomStructType(fieldType) {
|
||||
return setCustomTypeValue(field, value)
|
||||
}
|
||||
|
||||
converter, exists := typeConverters[fieldType.Kind()]
|
||||
if !exists {
|
||||
return nil, fmt.Errorf("不支持的类型: %s", fieldType.Kind())
|
||||
}
|
||||
|
||||
result, err := converter(field, value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
field.Set(reflect.ValueOf(result))
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (ds *defaultValueSetter) SetSliceElementValue(elemValue reflect.Value, item interface{}, elemType reflect.Type) error {
|
||||
if elemType.Kind() == reflect.Ptr {
|
||||
if elemValue.IsNil() {
|
||||
elemValue.Set(reflect.New(elemType.Elem()))
|
||||
}
|
||||
return ds.SetSliceElementValue(elemValue.Elem(), item, elemType.Elem())
|
||||
}
|
||||
|
||||
if hasUnmarshalJSON(elemType) {
|
||||
return setUnmarshalJSONValue(elemValue, item)
|
||||
}
|
||||
|
||||
switch elemType.Kind() {
|
||||
case reflect.String:
|
||||
elemValue.SetString(convertToString(item))
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
num, err := convertToFloat64(item)
|
||||
if err != nil {
|
||||
return fmt.Errorf("无法转换为整型: %w", err)
|
||||
}
|
||||
elemValue.SetInt(int64(num))
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||
num, err := convertToFloat64(item)
|
||||
if err != nil {
|
||||
return fmt.Errorf("无法转换为无符号整型: %w", err)
|
||||
}
|
||||
elemValue.SetUint(uint64(num))
|
||||
case reflect.Float32, reflect.Float64:
|
||||
num, err := convertToFloat64(item)
|
||||
if err != nil {
|
||||
return fmt.Errorf("无法转换为浮点型: %w", err)
|
||||
}
|
||||
elemValue.SetFloat(num)
|
||||
case reflect.Bool:
|
||||
if b, ok := item.(bool); ok {
|
||||
elemValue.SetBool(b)
|
||||
} else {
|
||||
return fmt.Errorf("无法转换为布尔型")
|
||||
}
|
||||
case reflect.Struct:
|
||||
if isBasicStructType(elemType) {
|
||||
return setBasicStructElement(elemValue, item)
|
||||
}
|
||||
return setStructElement(elemValue, item)
|
||||
default:
|
||||
return fmt.Errorf("不支持的切片元素类型: %s", elemType.Kind())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user