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 }