validator/v10/validate_value.go

91 lines
2.4 KiB
Go

// Package v10 ...
//
// Description : v10 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2025-01-24 16:42
package v10
import (
"git.zhangdeman.cn/gateway/validator/v10/define"
"git.zhangdeman.cn/zhangdeman/wrapper"
"sync"
)
// ValidateVar 验证任意变量值
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:44 2025/1/24
func ValidateVar(inputVal any, ruleConfig define.FieldValidateGenerateConfig) error {
validateRuleExpress, err := fieldValidatorRuleExpressGenerateFunc(ruleConfig)
if nil != err {
return err
}
if err = validateInstance.Var(inputVal, validateRuleExpress); nil != err {
return err
}
return nil
}
// ValidateMap 验证Map数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:56 2025/1/24
//
// 参数:
// - inputMap: 输入的map数据
// - ruleConfigMap: map数据每一项的验证规则
//
// 返回值:
// - 验证结果表, key为验证的字段, val为验证的错误信息, 返回异常表长度为 0, 说明验证通过
func ValidateMap(inputMap map[string]any, ruleConfigMap map[string]define.FieldValidateGenerateConfig) map[string]error {
errTable := map[string]error{}
lock := &sync.RWMutex{}
wg := &sync.WaitGroup{}
wg.Add(len(inputMap))
for mapKey, mapVal := range inputMap {
go func(key string, val any) {
defer wg.Done()
if _, exist := ruleConfigMap[mapKey]; !exist {
// 未传入验证规则, 不验证
return
}
if err := ValidateVar(val, ruleConfigMap[key]); nil != err {
// 验证失败
lock.Lock()
defer lock.Unlock()
errTable[key] = err
}
}(mapKey, mapVal)
}
wg.Wait()
return errTable
}
// ValidateDynamicStruct 验证动态结构体
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:28 2025/1/24
func ValidateDynamicStruct(inputMap map[string]any, ruleConfigMap map[string]define.FieldValidateGenerateConfig) error {
realMapData := make(map[string]any)
tagMap := make(map[string]string)
for mapKey, mapVal := range inputMap {
if _, exist := ruleConfigMap[mapKey]; !exist {
continue
}
realMapData[mapKey] = mapVal
express, err := fieldValidatorRuleExpressGenerateFunc(ruleConfigMap[mapKey])
if nil != err {
return err
}
tagMap[mapKey] = "validate:\"" + express + "\""
}
dynamicStruct := wrapper.NewMap2DynamicStruct(realMapData, tagMap)
structVal := dynamicStruct.ToStructDefaultValue()
return validateInstance.Struct(structVal)
}