usage.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package sql_mapping
  2. import (
  3. "git.sxidc.com/go-tools/utils/encoding"
  4. "git.sxidc.com/go-tools/utils/reflectutils"
  5. "git.sxidc.com/go-tools/utils/strutils"
  6. "github.com/pkg/errors"
  7. "reflect"
  8. "strings"
  9. )
  10. type Field struct {
  11. FieldName string
  12. ColumnName string
  13. IsKey bool
  14. CanUpdate bool
  15. CanUpdateClear bool
  16. Value any
  17. }
  18. func DefaultUsage(e any) ([]Field, error) {
  19. fields := make([]Field, 0)
  20. err := UseTag(e, defaultCallback(&fields))
  21. if err != nil {
  22. return nil, err
  23. }
  24. return fields, nil
  25. }
  26. func defaultCallback(fields *[]Field) OnParsedFieldTagFunc {
  27. return func(fieldName string, entityFieldElemValue reflect.Value, tag *Tag) error {
  28. field := Field{
  29. FieldName: fieldName,
  30. ColumnName: tag.Name,
  31. IsKey: tag.IsKey,
  32. CanUpdate: tag.CanUpdate,
  33. CanUpdateClear: tag.CanUpdateClear,
  34. }
  35. entityFieldKind := reflectutils.GroupValueKind(entityFieldElemValue)
  36. if entityFieldElemValue.IsZero() && !reflectutils.IsValueTime(entityFieldElemValue) {
  37. if entityFieldKind == reflect.Slice && reflectutils.IsSliceValueOf(entityFieldElemValue, reflect.String) ||
  38. entityFieldKind == reflect.String {
  39. field.Value = ""
  40. } else {
  41. field.Value = reflectutils.ZeroValueToAny(entityFieldElemValue)
  42. }
  43. *fields = append(*fields, field)
  44. return nil
  45. }
  46. switch entityFieldKind {
  47. case reflect.Struct:
  48. if !reflectutils.IsValueTime(entityFieldElemValue) {
  49. return errors.New(fieldName + " Error: 解析tag内部错误,除time.Time类型之外的结构被回调")
  50. }
  51. field.Value = entityFieldElemValue.Interface()
  52. case reflect.Slice:
  53. if !reflectutils.IsSliceValueOf(entityFieldElemValue, reflect.String) {
  54. return errors.New(fieldName + " Error: slice仅支持[]string")
  55. }
  56. strValue, err := dealStringValue(strings.Join(entityFieldElemValue.Interface().([]string), tag.JoinWith), tag)
  57. if err != nil {
  58. return err
  59. }
  60. field.Value = strValue
  61. case reflect.String:
  62. strValue, err := dealStringValue(entityFieldElemValue.Interface().(string), tag)
  63. if err != nil {
  64. return err
  65. }
  66. field.Value = strValue
  67. default:
  68. field.Value = entityFieldElemValue.Interface()
  69. }
  70. *fields = append(*fields, field)
  71. return nil
  72. }
  73. }
  74. func dealStringValue(value string, tag *Tag) (string, error) {
  75. retValue := value
  76. if strutils.IsStringNotEmpty(tag.Trim) {
  77. retValue = strings.Trim(retValue, tag.Trim)
  78. } else {
  79. if strutils.IsStringNotEmpty(tag.TrimPrefix) {
  80. retValue = strings.TrimPrefix(retValue, tag.TrimPrefix)
  81. }
  82. if strutils.IsStringNotEmpty(tag.TrimSuffix) {
  83. retValue = strings.TrimSuffix(retValue, tag.TrimSuffix)
  84. }
  85. }
  86. if strutils.IsStringNotEmpty(tag.AESKey) {
  87. encryptedValue, err := encoding.AESEncrypt(retValue, tag.AESKey)
  88. if err != nil {
  89. return "", err
  90. }
  91. retValue = encryptedValue
  92. }
  93. return retValue, nil
  94. }