object.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package domain
  2. import (
  3. "git.sxidc.com/go-tools/utils/reflectutils"
  4. "git.sxidc.com/go-tools/utils/strutils"
  5. "git.sxidc.com/go-tools/utils/template"
  6. "git.sxidc.com/service-supports/fserr"
  7. "github.com/iancoleman/strcase"
  8. "reflect"
  9. )
  10. type Object interface {
  11. DBSchema() string
  12. DomainCNName() string
  13. DomainCamelName() string
  14. }
  15. func HasField(object Object, fieldName string) bool {
  16. return hasField(object, fieldName)
  17. }
  18. func SetField[T any](object Object, fieldName string, value T) error {
  19. if object == nil {
  20. return fserr.New("领域对象为nil")
  21. }
  22. fieldValue, err := getFieldValue(object, fieldName)
  23. if err != nil {
  24. return err
  25. }
  26. if !fieldValue.IsValid() || !fieldValue.CanSet() {
  27. return fserr.New("领域对象" + fieldValue.Type().String() + "的字段" + fieldName + "无法赋值")
  28. }
  29. fieldValue.Set(reflect.ValueOf(value))
  30. return nil
  31. }
  32. func Field[T any](object Object, fieldName string) (T, error) {
  33. zero := reflectutils.Zero[T]()
  34. if object == nil {
  35. return zero, fserr.New("领域对象为nil")
  36. }
  37. fieldValue, err := getFieldValue(object, fieldName)
  38. if err != nil {
  39. return zero, err
  40. }
  41. if !fieldValue.IsValid() {
  42. return zero, fserr.New("领域对象" + fieldValue.Type().String() + "的字段" + fieldName + "无法赋值")
  43. }
  44. retValue, ok := fieldValue.Interface().(T)
  45. if !ok {
  46. return zero, err
  47. }
  48. return retValue, nil
  49. }
  50. func ToConcrete[T Object](object Object) (T, error) {
  51. zero := reflectutils.Zero[T]()
  52. if object == nil {
  53. return zero, fserr.New("领域对象为nil")
  54. }
  55. concrete, ok := object.(T)
  56. if !ok {
  57. return zero, fserr.New("领域对象转化失败")
  58. }
  59. return concrete, nil
  60. }
  61. func hasField(object Object, fieldName string) bool {
  62. if object == nil {
  63. return false
  64. }
  65. objectValue := reflect.ValueOf(object)
  66. if !reflectutils.IsValueStructOrStructPointer(objectValue) {
  67. return false
  68. }
  69. fieldValue := reflectutils.PointerValueElem(objectValue).FieldByName(fieldName)
  70. if !fieldValue.IsValid() {
  71. return false
  72. }
  73. return true
  74. }
  75. func getFieldValue(object Object, fieldName string) (*reflect.Value, error) {
  76. if object == nil {
  77. return nil, fserr.New("领域对象为nil")
  78. }
  79. objectValue := reflect.ValueOf(object)
  80. if !reflectutils.IsValueStructOrStructPointer(objectValue) {
  81. return nil, fserr.New("领域对象必须是结构或结构指针")
  82. }
  83. fieldValue := reflectutils.PointerValueElem(objectValue).FieldByName(fieldName)
  84. return &fieldValue, nil
  85. }
  86. func TableName(schema string, object Object) string {
  87. if strutils.IsStringNotEmpty(object.DBSchema()) {
  88. schema = object.DBSchema()
  89. }
  90. if strutils.IsStringEmpty(schema) {
  91. return template.Plural(strcase.ToSnake(template.Id(object.DomainCamelName())))
  92. } else {
  93. return schema + "." + template.Plural(strcase.ToSnake(template.Id(object.DomainCamelName())))
  94. }
  95. }
  96. func RelationTableName(schema string, left Object, right Object) string {
  97. if strutils.IsStringEmpty(schema) {
  98. return strcase.ToSnake(template.Id(left.DomainCamelName())) + "_and_" + strcase.ToSnake(template.Id(right.DomainCamelName()))
  99. } else {
  100. return schema + "." + strcase.ToSnake(template.Id(left.DomainCamelName())) + "_and_" + strcase.ToSnake(template.Id(right.DomainCamelName()))
  101. }
  102. }
  103. func RelativeDomainPath(object Object) string {
  104. return "/" + strcase.ToLowerCamel(template.Id(object.DomainCamelName()))
  105. }
  106. func SnakeDomainName(object Object) string {
  107. return strcase.ToSnake(template.Id(object.DomainCamelName()))
  108. }