github.com/zhongdalu/gf@v1.0.0/g/util/gvalid/gvalid_check_map.go (about) 1 // Copyright 2017-2018 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/zhongdalu/gf. 6 7 package gvalid 8 9 import ( 10 "strings" 11 12 "github.com/zhongdalu/gf/g/util/gconv" 13 ) 14 15 // 检测键值对参数Map, 16 // rules参数支持 []string / map[string]string 类型,前面一种类型支持返回校验结果顺序(具体格式参考struct tag),后一种不支持; 17 // rules参数中得 map[string]string 是一个2维的关联数组,第一维键名为参数键名,第二维为带有错误的校验规则名称,值为错误信息。 18 func CheckMap(params interface{}, rules interface{}, msgs ...CustomMsg) *Error { 19 // 将参数转换为 map[string]interface{}类型 20 data := gconv.Map(params) 21 if data == nil { 22 return newErrorStr("invalid_params", "invalid params type: convert to map[string]interface{} failed") 23 } 24 // 真实校验规则数据结构 25 checkRules := make(map[string]string) 26 // 真实自定义错误信息数据结构 27 customMsgs := make(CustomMsg) 28 // 返回的顺序规则 29 errorRules := make([]string, 0) 30 // 返回的校验错误 31 errorMaps := make(ErrorMap) 32 // 解析rules参数 33 switch v := rules.(type) { 34 // 支持校验错误顺序: []sequence tag 35 case []string: 36 for _, tag := range v { 37 name, rule, msg := parseSequenceTag(tag) 38 if len(name) == 0 { 39 continue 40 } 41 // 错误提示 42 if len(msg) > 0 { 43 ruleArray := strings.Split(rule, "|") 44 msgArray := strings.Split(msg, "|") 45 for k, v := range ruleArray { 46 // 如果msg条数比rule少,那么多余的rule使用默认的错误信息 47 if len(msgArray) <= k { 48 continue 49 } 50 if len(msgArray[k]) == 0 { 51 continue 52 } 53 array := strings.Split(v, ":") 54 if _, ok := customMsgs[name]; !ok { 55 customMsgs[name] = make(map[string]string) 56 } 57 customMsgs[name].(map[string]string)[strings.TrimSpace(array[0])] = strings.TrimSpace(msgArray[k]) 58 } 59 } 60 checkRules[name] = rule 61 errorRules = append(errorRules, name+"@"+rule) 62 } 63 64 // 不支持校验错误顺序: map[键名]校验规则 65 case map[string]string: 66 checkRules = v 67 } 68 // 自定义错误消息,非必须参数,优先级比rules参数中定义的错误消息更高 69 if len(msgs) > 0 && len(msgs[0]) > 0 { 70 if len(customMsgs) > 0 { 71 for k, v := range msgs[0] { 72 customMsgs[k] = v 73 } 74 } else { 75 customMsgs = msgs[0] 76 } 77 } 78 // 开始执行校验: 以校验规则作为基础进行遍历校验 79 var value interface{} 80 // 这里的rule变量为多条校验规则,不包含名字或者错误信息定义 81 for key, rule := range checkRules { 82 // 如果规则为空,那么不执行校验 83 if len(rule) == 0 { 84 continue 85 } 86 value = nil 87 if v, ok := data[key]; ok { 88 value = v 89 } 90 if e := Check(value, rule, customMsgs[key], data); e != nil { 91 _, item := e.FirstItem() 92 // 如果值为nil|"",并且不需要require*验证时,其他验证失效 93 if value == nil || gconv.String(value) == "" { 94 required := false 95 // rule => error 96 for k := range item { 97 if _, ok := mustCheckRulesEvenValueEmpty[k]; ok { 98 required = true 99 break 100 } 101 } 102 if !required { 103 continue 104 } 105 } 106 if _, ok := errorMaps[key]; !ok { 107 errorMaps[key] = make(map[string]string) 108 } 109 for k, v := range item { 110 errorMaps[key][k] = v 111 } 112 } 113 } 114 if len(errorMaps) > 0 { 115 return newError(errorRules, errorMaps) 116 } 117 return nil 118 }