|
|
@@ -10,51 +10,41 @@ import (
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
-type OnAssignParsedFieldTagFunc func(fromFieldName string, fromFieldElemValue reflect.Value, retFieldElementValue reflect.Value, tag *AssignTag) error
|
|
|
+type OnAssignParsedFieldTagFunc func(fromFieldName string, fromFieldElemValue reflect.Value, toFieldElementValue reflect.Value, assignTag *AssignTag) error
|
|
|
|
|
|
-func AssignTo(from any, to any) error {
|
|
|
- return CustomAssignTo(from, to, func(fromFieldName string, fromFieldElemValue reflect.Value, retFieldElementValue reflect.Value, tag *AssignTag) error {
|
|
|
- if fromFieldElemValue.IsZero() {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- return assignField(fromFieldElemValue, retFieldElementValue, tag)
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-func CustomAssignTo(from any, to any, onParsedFieldTagFunc OnAssignParsedFieldTagFunc) error {
|
|
|
+func UseAssignTag(from any, to any, onParsedFieldTagFunc OnAssignParsedFieldTagFunc) error {
|
|
|
if from == nil || to == nil {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
fromValue := reflect.ValueOf(from)
|
|
|
- retValue := reflect.ValueOf(to)
|
|
|
+ toValue := reflect.ValueOf(to)
|
|
|
|
|
|
// 类型校验
|
|
|
if !reflectutils.IsValueStructOrStructPointer(fromValue) {
|
|
|
return fserr.New("参数不是结构或结构指针")
|
|
|
}
|
|
|
|
|
|
- if !reflectutils.IsValueStructPointer(retValue) {
|
|
|
+ if !reflectutils.IsValueStructPointer(toValue) {
|
|
|
return fserr.New("返回类型不是结构指针")
|
|
|
}
|
|
|
|
|
|
fromElemValue := reflectutils.PointerValueElem(fromValue)
|
|
|
- retElemValue := reflectutils.PointerValueElem(retValue)
|
|
|
+ toElemValue := reflectutils.PointerValueElem(toValue)
|
|
|
|
|
|
- for i := 0; i < retElemValue.NumField(); i++ {
|
|
|
- retField := retElemValue.Field(i)
|
|
|
- if !retField.IsValid() {
|
|
|
+ for i := 0; i < toElemValue.NumField(); i++ {
|
|
|
+ toField := toElemValue.Field(i)
|
|
|
+ if !toField.IsValid() {
|
|
|
return fserr.New("被赋值的结构存在无效字段")
|
|
|
}
|
|
|
|
|
|
// 初始化空值指针
|
|
|
- if retField.Kind() == reflect.Ptr && retField.IsNil() {
|
|
|
- retField.Set(reflect.New(retField.Type().Elem()))
|
|
|
+ if toField.Kind() == reflect.Ptr && toField.IsNil() {
|
|
|
+ toField.Set(reflect.New(toField.Type().Elem()))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- err := parseStructAssignTag(fromElemValue, &retElemValue, onParsedFieldTagFunc)
|
|
|
+ err := parseStructAssignTag(fromElemValue, &toElemValue, onParsedFieldTagFunc)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
@@ -62,33 +52,33 @@ func CustomAssignTo(from any, to any, onParsedFieldTagFunc OnAssignParsedFieldTa
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func assignField(fromFieldElemValue reflect.Value, retFieldElemValue reflect.Value, tag *AssignTag) error {
|
|
|
+func DefaultOnAssignParsedFieldTagFunc(fromFieldElemValue reflect.Value, toFieldElemValue reflect.Value, assignTag *AssignTag) error {
|
|
|
fromKind := reflectutils.GroupValueKind(fromFieldElemValue)
|
|
|
- retKind := reflectutils.GroupValueKind(retFieldElemValue)
|
|
|
+ toKind := reflectutils.GroupValueKind(toFieldElemValue)
|
|
|
|
|
|
var fromAny any
|
|
|
switch fromKind {
|
|
|
case reflect.Struct:
|
|
|
// time.Time类型的结构,接收字段是string类型,使用FormatTime的格式转换
|
|
|
- if reflectutils.IsValueTime(fromFieldElemValue) && retKind == reflect.String {
|
|
|
- fromString := fromFieldElemValue.Interface().(time.Time).Format(tag.FormatTime)
|
|
|
- fromAny = assignTrimFromString(fromString, tag)
|
|
|
+ if reflectutils.IsValueTime(fromFieldElemValue) && toKind == reflect.String {
|
|
|
+ fromString := fromFieldElemValue.Interface().(time.Time).Format(assignTag.FormatTime)
|
|
|
+ fromAny = assignTrimFromString(fromString, assignTag)
|
|
|
break
|
|
|
}
|
|
|
|
|
|
// 不是time.Time类型的结构,接收字段是结构,执行结构到结构字段的赋值
|
|
|
- if !reflectutils.IsValueTime(fromFieldElemValue) && retKind == reflect.Struct {
|
|
|
- return parseStructAssignTag(fromFieldElemValue, &retFieldElemValue, func(fromFieldName string, fromFieldElemValue reflect.Value, retFieldElementValue reflect.Value, tag *AssignTag) error {
|
|
|
- return assignField(fromFieldElemValue, retFieldElementValue, tag)
|
|
|
+ if !reflectutils.IsValueTime(fromFieldElemValue) && toKind == reflect.Struct {
|
|
|
+ return parseStructAssignTag(fromFieldElemValue, &toFieldElemValue, func(fromFieldName string, fromFieldElemValue reflect.Value, toFieldElementValue reflect.Value, tag *AssignTag) error {
|
|
|
+ return DefaultOnAssignParsedFieldTagFunc(fromFieldElemValue, toFieldElementValue, assignTag)
|
|
|
})
|
|
|
}
|
|
|
|
|
|
// 直接将整个结构进行字段赋值
|
|
|
fromAny = fromFieldElemValue.Interface()
|
|
|
case reflect.Slice:
|
|
|
- if reflectutils.IsSliceValueOf(fromFieldElemValue, reflect.String) && retKind == reflect.String {
|
|
|
- fromString := strings.Join(fromFieldElemValue.Interface().([]string), tag.JoinWith)
|
|
|
- fromAny = assignTrimFromString(fromString, tag)
|
|
|
+ if reflectutils.IsSliceValueOf(fromFieldElemValue, reflect.String) && toKind == reflect.String {
|
|
|
+ fromString := strings.Join(fromFieldElemValue.Interface().([]string), assignTag.JoinWith)
|
|
|
+ fromAny = assignTrimFromString(fromString, assignTag)
|
|
|
break
|
|
|
}
|
|
|
|
|
|
@@ -96,60 +86,60 @@ func assignField(fromFieldElemValue reflect.Value, retFieldElemValue reflect.Val
|
|
|
case reflect.String:
|
|
|
fromString := fromFieldElemValue.String()
|
|
|
|
|
|
- if reflectutils.IsValueTime(retFieldElemValue) {
|
|
|
- retTimeField, err := time.ParseInLocation(tag.ParseTime, fromString, time.Local)
|
|
|
+ if reflectutils.IsValueTime(toFieldElemValue) {
|
|
|
+ toTimeField, err := time.ParseInLocation(assignTag.ParseTime, fromString, time.Local)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- fromAny = retTimeField
|
|
|
+ fromAny = toTimeField
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- if reflectutils.IsSliceValueOf(retFieldElemValue, reflect.String) {
|
|
|
- fromAny = strings.Split(fromString, tag.SplitWith)
|
|
|
+ if reflectutils.IsSliceValueOf(toFieldElemValue, reflect.String) {
|
|
|
+ fromAny = strings.Split(fromString, assignTag.SplitWith)
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- fromAny = assignTrimFromString(fromString, tag)
|
|
|
+ fromAny = assignTrimFromString(fromString, assignTag)
|
|
|
default:
|
|
|
fromAny = fromFieldElemValue.Interface()
|
|
|
}
|
|
|
|
|
|
- switch retKind {
|
|
|
+ switch toKind {
|
|
|
case reflect.Int64:
|
|
|
- return reflectutils.AssignInt64Value(fromAny, retFieldElemValue)
|
|
|
+ return reflectutils.AssignInt64Value(fromAny, toFieldElemValue)
|
|
|
case reflect.Uint64:
|
|
|
- return reflectutils.AssignUint64Value(fromAny, retFieldElemValue)
|
|
|
+ return reflectutils.AssignUint64Value(fromAny, toFieldElemValue)
|
|
|
case reflect.Float64:
|
|
|
- return reflectutils.AssignFloat64Value(fromAny, retFieldElemValue)
|
|
|
+ return reflectutils.AssignFloat64Value(fromAny, toFieldElemValue)
|
|
|
case reflect.Bool:
|
|
|
- return reflectutils.AssignBoolValue(fromAny, retFieldElemValue)
|
|
|
+ return reflectutils.AssignBoolValue(fromAny, toFieldElemValue)
|
|
|
case reflect.String:
|
|
|
- return reflectutils.AssignStringValue(fromAny, retFieldElemValue)
|
|
|
+ return reflectutils.AssignStringValue(fromAny, toFieldElemValue)
|
|
|
default:
|
|
|
- retFieldElemValue.Set(reflect.ValueOf(fromAny))
|
|
|
+ toFieldElemValue.Set(reflect.ValueOf(fromAny))
|
|
|
return nil
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func assignTrimFromString(fromString string, tag *AssignTag) string {
|
|
|
- if strutils.IsStringNotEmpty(tag.Trim) {
|
|
|
- return strings.Trim(fromString, tag.Trim)
|
|
|
+func assignTrimFromString(fromString string, assignTag *AssignTag) string {
|
|
|
+ if strutils.IsStringNotEmpty(assignTag.Trim) {
|
|
|
+ return strings.Trim(fromString, assignTag.Trim)
|
|
|
} else {
|
|
|
- if strutils.IsStringNotEmpty(tag.TrimPrefix) {
|
|
|
- return strings.TrimPrefix(fromString, tag.TrimPrefix)
|
|
|
+ if strutils.IsStringNotEmpty(assignTag.TrimPrefix) {
|
|
|
+ return strings.TrimPrefix(fromString, assignTag.TrimPrefix)
|
|
|
}
|
|
|
|
|
|
- if strutils.IsStringNotEmpty(tag.TrimSuffix) {
|
|
|
- return strings.TrimSuffix(fromString, tag.TrimSuffix)
|
|
|
+ if strutils.IsStringNotEmpty(assignTag.TrimSuffix) {
|
|
|
+ return strings.TrimSuffix(fromString, assignTag.TrimSuffix)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return fromString
|
|
|
}
|
|
|
|
|
|
-func parseStructAssignTag(fromElemValue reflect.Value, retElemValue *reflect.Value, onParsedFieldTagFunc OnAssignParsedFieldTagFunc) error {
|
|
|
+func parseStructAssignTag(fromElemValue reflect.Value, toElemValue *reflect.Value, onParsedFieldTagFunc OnAssignParsedFieldTagFunc) error {
|
|
|
for i := 0; i < fromElemValue.NumField(); i++ {
|
|
|
fromField := fromElemValue.Type().Field(i)
|
|
|
fromFieldValue := fromElemValue.Field(i)
|
|
|
@@ -170,7 +160,7 @@ func parseStructAssignTag(fromElemValue reflect.Value, retElemValue *reflect.Val
|
|
|
// 结构类型的字段上没有添加Tag, 先尝试直接按照字段赋值
|
|
|
if strutils.IsStringEmpty(tagStr) && fromFieldElemValue.Kind() == reflect.Struct &&
|
|
|
!reflectutils.IsValueTime(fromFieldElemValue) {
|
|
|
- err := parseStructAssignTag(fromFieldElemValue, retElemValue, onParsedFieldTagFunc)
|
|
|
+ err := parseStructAssignTag(fromFieldElemValue, toElemValue, onParsedFieldTagFunc)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
@@ -178,41 +168,41 @@ func parseStructAssignTag(fromElemValue reflect.Value, retElemValue *reflect.Val
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- tag, err := parseAssignTag(fromField, tagStr)
|
|
|
+ assignTag, err := parseAssignTag(fromField, tagStr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- if tag == nil {
|
|
|
+ if assignTag == nil {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- retFieldValue := retElemValue.FieldByName(tag.ToField)
|
|
|
+ toFieldValue := toElemValue.FieldByName(assignTag.ToField)
|
|
|
|
|
|
// 不存在对应的字段
|
|
|
- if !retFieldValue.IsValid() {
|
|
|
+ if !toFieldValue.IsValid() {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- retFieldElemValue := retFieldValue
|
|
|
- if retFieldValue.Kind() == reflect.Pointer {
|
|
|
- if !retFieldValue.IsValid() {
|
|
|
+ toFieldElemValue := toFieldValue
|
|
|
+ if toFieldValue.Kind() == reflect.Pointer {
|
|
|
+ if !toFieldValue.IsValid() {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- if !retFieldValue.CanSet() {
|
|
|
+ if !toFieldValue.CanSet() {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
// 空值针,初始化
|
|
|
- if retFieldValue.IsNil() {
|
|
|
- retFieldValue.Set(reflect.New(retFieldValue.Type().Elem()))
|
|
|
+ if toFieldValue.IsNil() {
|
|
|
+ toFieldValue.Set(reflect.New(toFieldValue.Type().Elem()))
|
|
|
}
|
|
|
|
|
|
- retFieldElemValue = retFieldValue.Elem()
|
|
|
+ toFieldElemValue = toFieldValue.Elem()
|
|
|
}
|
|
|
|
|
|
- err = onParsedFieldTagFunc(fromField.Name, fromFieldElemValue, retFieldElemValue, tag)
|
|
|
+ err = onParsedFieldTagFunc(fromField.Name, fromFieldElemValue, toFieldElemValue, assignTag)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
@@ -256,7 +246,7 @@ func parseAssignTag(field reflect.StructField, tagStr string) (*AssignTag, error
|
|
|
return nil, nil
|
|
|
}
|
|
|
|
|
|
- tag := &AssignTag{
|
|
|
+ assignTag := &AssignTag{
|
|
|
ToField: field.Name,
|
|
|
ParseTime: time.DateTime,
|
|
|
FormatTime: time.DateTime,
|
|
|
@@ -268,7 +258,7 @@ func parseAssignTag(field reflect.StructField, tagStr string) (*AssignTag, error
|
|
|
}
|
|
|
|
|
|
if strutils.IsStringEmpty(tagStr) {
|
|
|
- return tag, nil
|
|
|
+ return assignTag, nil
|
|
|
}
|
|
|
|
|
|
assignParts := strings.Split(tagStr, assignTagPartSeparator)
|
|
|
@@ -281,29 +271,29 @@ func parseAssignTag(field reflect.StructField, tagStr string) (*AssignTag, error
|
|
|
|
|
|
switch assignPartKeyValue[0] {
|
|
|
case assignToField:
|
|
|
- tag.ToField = assignPartKeyValue[1]
|
|
|
+ assignTag.ToField = assignPartKeyValue[1]
|
|
|
case assignParseTime:
|
|
|
- tag.ParseTime = assignPartKeyValue[1]
|
|
|
+ assignTag.ParseTime = assignPartKeyValue[1]
|
|
|
case assignFormatTime:
|
|
|
- tag.FormatTime = assignPartKeyValue[1]
|
|
|
+ assignTag.FormatTime = assignPartKeyValue[1]
|
|
|
case assignJoinWith:
|
|
|
if strutils.IsStringEmpty(assignPartKeyValue[1]) {
|
|
|
return nil, fserr.New(assignJoinWith + "没有赋值分隔符")
|
|
|
}
|
|
|
|
|
|
- tag.JoinWith = assignPartKeyValue[1]
|
|
|
+ assignTag.JoinWith = assignPartKeyValue[1]
|
|
|
case assignSplitWith:
|
|
|
if strutils.IsStringEmpty(assignPartKeyValue[1]) {
|
|
|
return nil, fserr.New(assignSplitWith + "没有赋值分隔符")
|
|
|
}
|
|
|
|
|
|
- tag.SplitWith = assignPartKeyValue[1]
|
|
|
+ assignTag.SplitWith = assignPartKeyValue[1]
|
|
|
case assignTrim:
|
|
|
- tag.Trim = assignPartKeyValue[1]
|
|
|
+ assignTag.Trim = assignPartKeyValue[1]
|
|
|
case assignTrimPrefix:
|
|
|
- tag.TrimPrefix = assignPartKeyValue[1]
|
|
|
+ assignTag.TrimPrefix = assignPartKeyValue[1]
|
|
|
case assignTrimSuffix:
|
|
|
- tag.TrimSuffix = assignPartKeyValue[1]
|
|
|
+ assignTag.TrimSuffix = assignPartKeyValue[1]
|
|
|
default:
|
|
|
err := fserr.New(assignTagKey + "不支持的tag: " + assignPartKeyValue[0])
|
|
|
logger.GetInstance().Error(err)
|
|
|
@@ -312,5 +302,5 @@ func parseAssignTag(field reflect.StructField, tagStr string) (*AssignTag, error
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return tag, nil
|
|
|
+ return assignTag, nil
|
|
|
}
|