12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package request
- import (
- "git.sxidc.com/go-framework/baize/framework/core/domain"
- "git.sxidc.com/go-framework/baize/framework/core/tag/assign"
- "git.sxidc.com/go-tools/utils/reflectutils"
- "github.com/pkg/errors"
- "reflect"
- )
- // Params 请求参数接口(抽象类)
- type Params interface{}
- // AssignRequestParamsToDomainObject 基于assign tag将请求参数赋值到领域对象
- // 参数:
- // - params: 请求参数
- // - domainObject: 领域对象
- // 返回值:
- // - 错误
- func AssignRequestParamsToDomainObject(params Params, domainObject domain.Object) error {
- return assign.DefaultUsage(params, domainObject)
- }
- // Field 获取请求对象中的字段值
- // 泛型参数:
- // - T: 请求对象中的字段值的类型
- // 参数:
- // - params: 请求参数
- // - fieldName: 字段名
- // 返回值:
- // - 请求对象中的字段值
- // - 错误
- func Field[T any](params Params, fieldName string) (T, error) {
- zero := reflectutils.Zero[T]()
- if params == nil {
- return zero, errors.New("请求参数为nil")
- }
- fieldValue, err := getRequestParamsValue(params, fieldName)
- if err != nil {
- return zero, err
- }
- if !fieldValue.IsValid() {
- return zero, errors.New("请求参数" + fieldValue.Type().String() + "的字段" + fieldName + "无法赋值")
- }
- retValue, ok := fieldValue.Interface().(T)
- if !ok {
- return zero, errors.New("请求参数" + fieldValue.Type().String() + "的字段" + fieldName + "无法转换类型")
- }
- return retValue, nil
- }
- // ToConcrete 将请求参数转换为具体的请求参数结构类型
- // 泛型参数:
- // - T: 具体的请求参数结构类型
- // 参数:
- // - params: 请求参数
- // 返回值:
- // - 具体的请求参数结构
- // - 错误
- func ToConcrete[T Params](params Params) (T, error) {
- zero := reflectutils.Zero[T]()
- if params == nil {
- return zero, errors.New("请求参数为nil")
- }
- concrete, ok := params.(T)
- if !ok {
- return zero, errors.New("请求参数转化失败")
- }
- return concrete, nil
- }
- func getRequestParamsValue(params Params, fieldName string) (*reflect.Value, error) {
- if params == nil {
- return nil, errors.New("请求参数为nil")
- }
- paramsValue := reflect.ValueOf(params)
- if !reflectutils.IsValueStructOrStructPointer(paramsValue) {
- return nil, errors.New("请求参数必须是结构或结构指针")
- }
- fieldValue := reflectutils.PointerValueElem(paramsValue).FieldByName(fieldName)
- return &fieldValue, nil
- }
|