params.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package request
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/domain"
  4. "git.sxidc.com/go-framework/baize/framework/core/tag/assign"
  5. "git.sxidc.com/go-tools/utils/reflectutils"
  6. "github.com/pkg/errors"
  7. "reflect"
  8. )
  9. // Params 请求参数接口(抽象类)
  10. type Params interface{}
  11. // AssignRequestParamsToDomainObject 基于assign tag将请求参数赋值到领域对象
  12. // 参数:
  13. // - params: 请求参数
  14. // - domainObject: 领域对象
  15. // 返回值:
  16. // - 错误
  17. func AssignRequestParamsToDomainObject(params Params, domainObject domain.Object) error {
  18. return assign.DefaultUsage(params, domainObject)
  19. }
  20. // Field 获取请求对象中的字段值
  21. // 泛型参数:
  22. // - T: 请求对象中的字段值的类型
  23. // 参数:
  24. // - params: 请求参数
  25. // - fieldName: 字段名
  26. // 返回值:
  27. // - 请求对象中的字段值
  28. // - 错误
  29. func Field[T any](params Params, fieldName string) (T, error) {
  30. zero := reflectutils.Zero[T]()
  31. if params == nil {
  32. return zero, errors.New("请求参数为nil")
  33. }
  34. fieldValue, err := getRequestParamsValue(params, fieldName)
  35. if err != nil {
  36. return zero, err
  37. }
  38. if !fieldValue.IsValid() {
  39. return zero, errors.New("请求参数" + fieldValue.Type().String() + "的字段" + fieldName + "无法赋值")
  40. }
  41. retValue, ok := fieldValue.Interface().(T)
  42. if !ok {
  43. return zero, errors.New("请求参数" + fieldValue.Type().String() + "的字段" + fieldName + "无法转换类型")
  44. }
  45. return retValue, nil
  46. }
  47. // ToConcrete 将请求参数转换为具体的请求参数结构类型
  48. // 泛型参数:
  49. // - T: 具体的请求参数结构类型
  50. // 参数:
  51. // - params: 请求参数
  52. // 返回值:
  53. // - 具体的请求参数结构
  54. // - 错误
  55. func ToConcrete[T Params](params Params) (T, error) {
  56. zero := reflectutils.Zero[T]()
  57. if params == nil {
  58. return zero, errors.New("请求参数为nil")
  59. }
  60. concrete, ok := params.(T)
  61. if !ok {
  62. return zero, errors.New("请求参数转化失败")
  63. }
  64. return concrete, nil
  65. }
  66. func getRequestParamsValue(params Params, fieldName string) (*reflect.Value, error) {
  67. if params == nil {
  68. return nil, errors.New("请求参数为nil")
  69. }
  70. paramsValue := reflect.ValueOf(params)
  71. if !reflectutils.IsValueStructOrStructPointer(paramsValue) {
  72. return nil, errors.New("请求参数必须是结构或结构指针")
  73. }
  74. fieldValue := reflectutils.PointerValueElem(paramsValue).FieldByName(fieldName)
  75. return &fieldValue, nil
  76. }