feat: 完成validate 10 验证规则解析
This commit is contained in:
2
go.mod
2
go.mod
@@ -5,7 +5,7 @@ go 1.24.0
|
|||||||
toolchain go1.24.1
|
toolchain go1.24.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f
|
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260106015608-42e268aea545
|
||||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd
|
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd
|
||||||
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251225094759-09c64ba2541c
|
git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251225094759-09c64ba2541c
|
||||||
github.com/gin-gonic/gin v1.11.0
|
github.com/gin-gonic/gin v1.11.0
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -1,5 +1,7 @@
|
|||||||
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f h1:2p5yxwk472XxY93UTky2Xl2doTU1uqR7vcKara/Dt1E=
|
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f h1:2p5yxwk472XxY93UTky2Xl2doTU1uqR7vcKara/Dt1E=
|
||||||
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc=
|
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260105014807-92a7dc3bb97f/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc=
|
||||||
|
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260106015608-42e268aea545 h1:A6UeeMcSqAlHUmA2coWIuiCS/W9ySylhZMa/0HbFDcQ=
|
||||||
|
git.zhangdeman.cn/zhangdeman/consts v0.0.0-20260106015608-42e268aea545/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc=
|
||||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42 h1:VjYrb4adud7FHeiYS9XA0B/tOaJjfRejzQAlwimrrDc=
|
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42 h1:VjYrb4adud7FHeiYS9XA0B/tOaJjfRejzQAlwimrrDc=
|
||||||
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI=
|
git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI=
|
||||||
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd h1:kTZOpR8iHx27sUufMWVYhDZx9Q4h80j7RWlaR8GIBiU=
|
git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd h1:kTZOpR8iHx27sUufMWVYhDZx9Q4h80j7RWlaR8GIBiU=
|
||||||
|
|||||||
@@ -28,11 +28,12 @@ type StructFieldInfo struct {
|
|||||||
Required bool `json:"required" dc:"是否必传"`
|
Required bool `json:"required" dc:"是否必传"`
|
||||||
Min *float64 `json:"min" dc:"最小值"`
|
Min *float64 `json:"min" dc:"最小值"`
|
||||||
Max *float64 `json:"max" dc:"最大值"`
|
Max *float64 `json:"max" dc:"最大值"`
|
||||||
MinLength *uint64 `json:"min_length" dc:"最小长度"`
|
MinLength *float64 `json:"min_length" dc:"最小长度"`
|
||||||
MaxLength *uint64 `json:"max_length" dc:"最大长度"`
|
MaxLength *float64 `json:"max_length" dc:"最大长度"`
|
||||||
Pattern string `json:"pattern" dc:"模式"`
|
Pattern string `json:"pattern" dc:"模式"`
|
||||||
Format string `json:"format" dc:"格式"`
|
Format string `json:"format" dc:"格式"`
|
||||||
Enum []define.EnumValue `json:"enum" dc:"枚举值列表"`
|
Enum []any `json:"enum" dc:"枚举值列表"`
|
||||||
|
EnumDesc []define.EnumValue `json:"enum_desc" dc:"枚举值详细描述"`
|
||||||
OmitEmpty bool `json:"omit_empty" dc:"是否可控"`
|
OmitEmpty bool `json:"omit_empty" dc:"是否可控"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,44 +57,18 @@ func ParseStructField(field reflect.StructField) *StructFieldInfo {
|
|||||||
// 解析示例值
|
// 解析示例值
|
||||||
info.Example = util.ParseStructFieldTag.GetExampleValue(field)
|
info.Example = util.ParseStructFieldTag.GetExampleValue(field)
|
||||||
// 解析验证规则
|
// 解析验证规则
|
||||||
if required := field.Tag.Get("required"); required == "true" {
|
validateRule := util.ParseValidateRule(field.Type, util.ParseStructFieldTag.GetValidateRule(field))
|
||||||
info.Required = true
|
info.Required = validateRule.Required
|
||||||
}
|
info.Min = validateRule.Min
|
||||||
|
info.Max = validateRule.Max
|
||||||
if min := field.Tag.Get("min"); min != "" {
|
info.MinLength = validateRule.Min
|
||||||
if val, err := strconv.ParseFloat(min, 64); err == nil {
|
info.MaxLength = validateRule.Max
|
||||||
info.Min = &val
|
info.Pattern = validateRule.Regexp
|
||||||
}
|
info.Format = field.Type.String()
|
||||||
}
|
|
||||||
|
|
||||||
if max := field.Tag.Get("max"); max != "" {
|
|
||||||
if val, err := strconv.ParseFloat(max, 64); err == nil {
|
|
||||||
info.Max = &val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if minLen := field.Tag.Get("minLength"); minLen != "" {
|
|
||||||
if val, err := strconv.ParseUint(minLen, 10, 64); err == nil {
|
|
||||||
info.MinLength = &val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if maxLen := field.Tag.Get("maxLength"); maxLen != "" {
|
|
||||||
if val, err := strconv.ParseUint(maxLen, 10, 64); err == nil {
|
|
||||||
info.MaxLength = &val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if pattern := field.Tag.Get("pattern"); pattern != "" {
|
|
||||||
info.Pattern = pattern
|
|
||||||
}
|
|
||||||
|
|
||||||
if format := field.Tag.Get("format"); format != "" {
|
|
||||||
info.Format = format
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析枚举值
|
// 解析枚举值
|
||||||
info.Enum = util.ParseStructFieldTag.EnumDescription(field)
|
info.Enum = validateRule.Oneof
|
||||||
|
info.EnumDesc = util.ParseStructFieldTag.EnumDescription(field)
|
||||||
|
|
||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
|
|
||||||
"git.zhangdeman.cn/zhangdeman/consts"
|
"git.zhangdeman.cn/zhangdeman/consts"
|
||||||
utilPkg "git.zhangdeman.cn/zhangdeman/util"
|
utilPkg "git.zhangdeman.cn/zhangdeman/util"
|
||||||
|
"git.zhangdeman.cn/zhangdeman/wrapper/op_string"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseValidateRule 解析验证规则
|
// ParseValidateRule 解析验证规则
|
||||||
@@ -59,24 +60,19 @@ func ParseValidateRule(dataType reflect.Type, ruleStr string) ValidateRule {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
switch ruleType {
|
switch ruleType {
|
||||||
case consts.ValidateRuleLte.String(), consts.ValidateRuleGte.String(), consts.ValidateRuleGt.String(), consts.ValidateRuleLt.String(): // 数字取值范围
|
case consts.ValidatorRuleLte.String(), consts.ValidatorRuleGte.String(), consts.ValidatorRuleGt.String(), consts.ValidatorRuleLt.String(), // 数字取值范围
|
||||||
|
consts.ValidatorRuleCommonLen.String(), consts.ValidatorRuleCommonMin.String(), consts.ValidatorRuleCommonMax.String(): // 长度取值范围
|
||||||
var val float64
|
var val float64
|
||||||
if err := utilPkg.ConvertAssign(&val, ruleValue); nil == err {
|
if err := utilPkg.ConvertAssign(&val, ruleValue); nil == err {
|
||||||
switch ruleType {
|
switch ruleType {
|
||||||
case consts.ValidateRuleLte.String():
|
case consts.ValidatorRuleLte.String():
|
||||||
rule.Lte = &val
|
rule.Lte = &val
|
||||||
case consts.ValidateRuleGte.String():
|
case consts.ValidatorRuleGte.String():
|
||||||
rule.Gte = &val
|
rule.Gte = &val
|
||||||
case consts.ValidateRuleGt.String():
|
case consts.ValidatorRuleGt.String():
|
||||||
rule.Gt = &val
|
rule.Gt = &val
|
||||||
case consts.ValidateRuleLt.String():
|
case consts.ValidatorRuleLt.String():
|
||||||
rule.Lt = &val
|
rule.Lt = &val
|
||||||
}
|
|
||||||
}
|
|
||||||
case consts.ValidatorRuleCommonLen.String(), consts.ValidatorRuleCommonMin.String(), consts.ValidatorRuleCommonMax.String(): // 长度取值范围
|
|
||||||
var val uint
|
|
||||||
if err := utilPkg.ConvertAssign(&val, ruleValue); nil == err {
|
|
||||||
switch ruleType {
|
|
||||||
case consts.ValidatorRuleCommonLen.String():
|
case consts.ValidatorRuleCommonLen.String():
|
||||||
rule.Len = &val
|
rule.Len = &val
|
||||||
case consts.ValidatorRuleCommonMin.String():
|
case consts.ValidatorRuleCommonMin.String():
|
||||||
@@ -85,11 +81,29 @@ func ParseValidateRule(dataType reflect.Type, ruleStr string) ValidateRule {
|
|||||||
rule.Max = &val
|
rule.Max = &val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case consts.ValidateRuleEq.String():
|
case consts.ValidatorRuleEq.String():
|
||||||
rule.Eq = ruleValue
|
rule.Eq = ruleValue
|
||||||
case consts.ValidateRuleNe.String():
|
case consts.ValidatorRuleNe.String():
|
||||||
rule.Ne = ruleValue
|
rule.Ne = ruleValue
|
||||||
|
case consts.ValidatorRuleRegexp.String():
|
||||||
|
rule.Regexp = ruleValue
|
||||||
case consts.ValidatorRuleCommonOneOf.String():
|
case consts.ValidatorRuleCommonOneOf.String():
|
||||||
|
rule.Oneof = make([]any, 0)
|
||||||
|
switch dataKind {
|
||||||
|
case reflect.String:
|
||||||
|
valList := strings.Split(ruleValue, " ")
|
||||||
|
for _, item := range valList {
|
||||||
|
rule.Oneof = append(rule.Oneof, item)
|
||||||
|
}
|
||||||
|
case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint,
|
||||||
|
reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int,
|
||||||
|
reflect.Float32, reflect.Float64:
|
||||||
|
valList := op_string.ToBaseTypeSlice[float64](ruleValue, " ").Value
|
||||||
|
for _, item := range valList {
|
||||||
|
rule.Oneof = append(rule.Oneof, item)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rule
|
return rule
|
||||||
@@ -102,10 +116,11 @@ type ValidateRule struct {
|
|||||||
Gte *float64 `json:"gte" dc:"数字类型大于等于"`
|
Gte *float64 `json:"gte" dc:"数字类型大于等于"`
|
||||||
Lt *float64 `json:"lt" dc:"数字类型小于"`
|
Lt *float64 `json:"lt" dc:"数字类型小于"`
|
||||||
Gt *float64 `json:"gt" dc:"数字类型大于"`
|
Gt *float64 `json:"gt" dc:"数字类型大于"`
|
||||||
Len *uint `json:"len" dc:"长度等于"`
|
Len *float64 `json:"len" dc:"长度等于"`
|
||||||
Max *uint `json:"max" dc:"长度小于等于"`
|
Max *float64 `json:"max" dc:"长度小于等于"`
|
||||||
Min *uint `json:"min" dc:"长度大于等于"`
|
Min *float64 `json:"min" dc:"长度大于等于"`
|
||||||
Eq any `json:"eq" dc:"等于"`
|
Eq any `json:"eq" dc:"等于"`
|
||||||
Ne any `json:"ne" dc:"不等于"`
|
Ne any `json:"ne" dc:"不等于"`
|
||||||
Oneof []any `json:"oneof" dc:"枚举值列表"`
|
Oneof []any `json:"oneof" dc:"枚举值列表"`
|
||||||
|
Regexp string `json:"regexp" dc:"正则表达式"`
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user