代码拉取完成,页面将自动刷新
// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本,
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3
package 验证类
import (
"context"
"errors"
"reflect"
"strings"
gcode "gitee.com/go_888/goframe/errors/gcode"
"gitee.com/go_888/goframe/internal/reflection"
gconv "gitee.com/go_888/goframe/util/gconv"
)
func (v *X结构_验证器) doCheckMap(ctx context.Context, params interface{}) Error {
if params == nil {
return nil
}
var (
checkRules = make([]fieldRule, 0)
customMessage = make(X类型_自定义错误消息) // map[RuleKey]ErrorMsg.
errorMaps = make(map[string]map[string]error)
)
switch assertValue := v.rules.(type) {
// 序列标签:[]序列标签
// 序列中错误结果的顺序是有意义的。
// md5:3ffc642de1ce88d6
case []string:
for _, tag := range assertValue {
name, rule, msg := X解析规则(tag)
if len(name) == 0 {
continue
}
if len(msg) > 0 {
var (
msgArray = strings.Split(msg, "|")
ruleArray = strings.Split(rule, "|")
)
for k, ruleItem := range ruleArray {
// 如果自定义消息的长度小于规则的长度,那么剩余的规则将使用默认的错误消息。
// md5:ada20f4d064fc46a
if len(msgArray) <= k {
continue
}
if len(msgArray[k]) == 0 {
continue
}
array := strings.Split(ruleItem, ":")
if _, ok := customMessage[name]; !ok {
customMessage[name] = make(map[string]string)
}
customMessage[name].(map[string]string)[strings.TrimSpace(array[0])] = strings.TrimSpace(msgArray[k])
}
}
checkRules = append(checkRules, fieldRule{
X字段别名: name,
X规则: rule,
})
}
// 无序列规则:map[field]rule. md5:5142e13fc1107ce4
case map[string]string:
for name, rule := range assertValue {
checkRules = append(checkRules, fieldRule{
X字段别名: name,
X规则: rule,
})
}
}
inputParamMap := gconv.X取Map(params)
if inputParamMap == nil {
return newValidationErrorByStr(
internalParamsErrRuleName,
errors.New("无效的参数类型:转换为 map 失败"),
)
}
if msg, ok := v.messages.(X类型_自定义错误消息); ok && len(msg) > 0 {
if len(customMessage) > 0 {
for k, v := range msg {
customMessage[k] = v
}
} else {
customMessage = msg
}
}
var (
value interface{}
validator = v.X浅拷贝对象()
)
// 该函数会递归地检查结构体,以确定其属性是否为嵌入式结构体。
// 从父结构体中忽略输入参数映射(inputParamMap)、关联(assoc)、规则(rules)和消息(messages)。
// md5:ac90de50afcf3ac6
validator.assoc = nil
validator.rules = nil
validator.messages = nil
for _, item := range inputParamMap {
originTypeAndKind := reflection.OriginTypeAndKind(item)
switch originTypeAndKind.OriginKind {
case reflect.Map, reflect.Struct, reflect.Slice, reflect.Array:
v.doCheckValueRecursively(ctx, doCheckValueRecursivelyInput{
Value: item,
Type: originTypeAndKind.InputType,
Kind: originTypeAndKind.OriginKind,
ErrorMaps: errorMaps,
})
}
// Bail feature.
if v.bail && len(errorMaps) > 0 {
break
}
}
if v.bail && len(errorMaps) > 0 {
return newValidationError(gcode.X变量_CodeValidationFailed, nil, errorMaps)
}
// 以下逻辑与CheckStruct的部分相同,但不支持序列化。 md5:98c6e4bd2e64ed87
for _, checkRuleItem := range checkRules {
if len(checkRuleItem.X规则) == 0 {
continue
}
value = nil
if valueItem, ok := inputParamMap[checkRuleItem.X字段别名]; ok {
value = valueItem
}
// 它在循环中检查每个规则及其值。 md5:5ab8f96747fbcec4
if validatedError := v.doCheckValue(ctx, doCheckValueInput{
Name: checkRuleItem.X字段别名,
Value: value,
ValueType: reflect.TypeOf(value),
Rule: checkRuleItem.X规则,
Messages: customMessage[checkRuleItem.X字段别名],
DataRaw: params,
DataMap: inputParamMap,
}); validatedError != nil {
_, errorItem := validatedError.X取第一条字段与错误()
// ===========================================================
// 仅在映射和结构体验证中:
// 如果值为nil或空字符串,并且没有required*规则,
// 它会清除错误消息。
// ===========================================================
// md5:561b52db8297e035
if gconv.String(value) == "" {
required := false
// rule => error
for ruleKey := range errorItem {
if required = v.checkRuleRequired(ruleKey); required {
break
}
}
if !required {
continue
}
}
if _, ok := errorMaps[checkRuleItem.X字段别名]; !ok {
errorMaps[checkRuleItem.X字段别名] = make(map[string]error)
}
for ruleKey, ruleError := range errorItem {
errorMaps[checkRuleItem.X字段别名][ruleKey] = ruleError
}
if v.bail {
break
}
}
}
if len(errorMaps) > 0 {
return newValidationError(gcode.X变量_CodeValidationFailed, checkRules, errorMaps)
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。