feat: 验证规则解析

This commit is contained in:
2026-01-05 22:50:12 +08:00
parent b3b090a020
commit e40b2959d7

View File

@@ -10,12 +10,89 @@ package util
import (
"reflect"
"strings"
"git.zhangdeman.cn/zhangdeman/consts"
utilPkg "git.zhangdeman.cn/zhangdeman/util"
)
// ParseValidateRule 解析验证规则
func ParseValidateRule(dataType reflect.Kind, ruleStr string) map[string]any {
func ParseValidateRule(dataType reflect.Type, ruleStr string) ValidateRule {
if dataType.Kind() == reflect.Ptr {
dataType = dataType.Elem()
}
dataKind := dataType.Kind()
rule := ValidateRule{
Omitempty: false,
Required: false,
Lte: nil,
Gte: nil,
Lt: nil,
Gt: nil,
Len: nil,
Max: nil,
Min: nil,
Eq: nil,
Ne: nil,
Oneof: nil,
}
ruleList := strings.Split(ruleStr, ",")
return nil
for _, itemRule := range ruleList {
itemRule = strings.ToLower(strings.TrimSpace(itemRule))
if len(itemRule) == 0 {
continue
}
if strings.Contains(itemRule, "=") {
// 一定是无需要值的验证规则
switch itemRule {
case consts.ValidatorRuleCommonRequired.String(): // 必传
rule.Required = true
case consts.ValidatorRuleCommonOmitempty.String(): // 为空则不校验
rule.Omitempty = true
}
continue
}
itemRuleArr := strings.Split(itemRule, "=")
ruleType := itemRuleArr[0]
ruleValue := strings.Join(itemRuleArr[1:], "=")
if len(ruleValue) == 0 {
// 未配置值的校验规则
continue
}
switch ruleType {
case consts.ValidateRuleLte.String(), consts.ValidateRuleGte.String(), consts.ValidateRuleGt.String(), consts.ValidateRuleLt.String(): // 数字取值范围
var val float64
if err := utilPkg.ConvertAssign(&val, ruleValue); nil == err {
switch ruleType {
case consts.ValidateRuleLte.String():
rule.Lte = &val
case consts.ValidateRuleGte.String():
rule.Gte = &val
case consts.ValidateRuleGt.String():
rule.Gt = &val
case consts.ValidateRuleLt.String():
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():
rule.Len = &val
case consts.ValidatorRuleCommonMin.String():
rule.Min = &val
case consts.ValidatorRuleCommonMax.String():
rule.Max = &val
}
}
case consts.ValidateRuleEq.String():
rule.Eq = ruleValue
case consts.ValidateRuleNe.String():
rule.Ne = ruleValue
case consts.ValidatorRuleCommonOneOf.String():
}
}
return rule
}
type ValidateRule struct {