github.com/zhongdalu/gf@v1.0.0/g/util/gvalid/gvalid_error.go (about) 1 // Copyright 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 "strings" 10 11 // 校验错误对象 12 type Error struct { 13 rules []string // 校验结果顺序(可能为nil),可保证返回校验错误的顺序性 14 errors ErrorMap // 完整的数据校验结果存储(map无序) 15 firstKey string // 第一条错误项键名(常用操作冗余数据),默认为空 16 firstItem map[string]string // 第一条错误项(常用操作冗余数据),默认为nil 17 } 18 19 // 校验错误信息: map[键名]map[规则名]错误信息 20 type ErrorMap map[string]map[string]string 21 22 // 创建一个校验错误对象指针(校验错误) 23 func newError(rules []string, errors map[string]map[string]string) *Error { 24 return &Error{ 25 rules: rules, 26 errors: errors, 27 } 28 } 29 30 // 创建一个校验错误对象指针(内部错误) 31 func newErrorStr(key, err string) *Error { 32 return &Error{ 33 rules: nil, 34 errors: map[string]map[string]string{ 35 "__gvalid__": { 36 key: err, 37 }, 38 }, 39 } 40 } 41 42 // 获得规则与错误信息的map; 当校验结果为多条数据校验时,返回第一条错误map(此时类似FirstItem) 43 func (e *Error) Map() map[string]string { 44 _, m := e.FirstItem() 45 return m 46 } 47 48 // 获得原始校验结果ErrorMap 49 func (e *Error) Maps() ErrorMap { 50 return e.errors 51 } 52 53 // 只获取第一个键名的校验错误项 54 func (e *Error) FirstItem() (key string, msgs map[string]string) { 55 if e.firstItem != nil { 56 return e.firstKey, e.firstItem 57 } 58 // 有序 59 if len(e.rules) > 0 { 60 for _, v := range e.rules { 61 name, _, _ := parseSequenceTag(v) 62 if m, ok := e.errors[name]; ok { 63 e.firstKey = name 64 e.firstItem = m 65 return name, m 66 } 67 } 68 } 69 // 无序 70 for k, m := range e.errors { 71 e.firstKey = k 72 e.firstItem = m 73 return k, m 74 } 75 return "", nil 76 } 77 78 // 只获取第一个校验错误项的规则及错误信息 79 func (e *Error) FirstRule() (rule string, err string) { 80 // 有序 81 if len(e.rules) > 0 { 82 for _, v := range e.rules { 83 name, rule, _ := parseSequenceTag(v) 84 if m, ok := e.errors[name]; ok { 85 for _, rule := range strings.Split(rule, "|") { 86 array := strings.Split(rule, ":") 87 rule = strings.TrimSpace(array[0]) 88 if err, ok := m[rule]; ok { 89 return rule, err 90 } 91 } 92 } 93 } 94 } 95 // 无序 96 for _, m := range e.errors { 97 for k, v := range m { 98 return k, v 99 } 100 } 101 return "", "" 102 } 103 104 // 只获取第一个校验错误项的错误信息 105 func (e *Error) FirstString() (err string) { 106 _, err = e.FirstRule() 107 return 108 } 109 110 // 将所有错误信息构建称字符串,多个错误信息字符串使用"; "符号分隔 111 func (e *Error) String() string { 112 return strings.Join(e.Strings(), "; ") 113 } 114 115 // 只返回错误信息,构造成字符串数组返回 116 func (e *Error) Strings() (errs []string) { 117 errs = make([]string, 0) 118 // 有序 119 if len(e.rules) > 0 { 120 for _, v := range e.rules { 121 name, rule, _ := parseSequenceTag(v) 122 if m, ok := e.errors[name]; ok { 123 for _, rule := range strings.Split(rule, "|") { 124 array := strings.Split(rule, ":") 125 rule = strings.TrimSpace(array[0]) 126 if err, ok := m[rule]; ok { 127 errs = append(errs, err) 128 } 129 } 130 } 131 } 132 return errs 133 } 134 // 无序 135 for _, m := range e.errors { 136 for _, err := range m { 137 errs = append(errs, err) 138 } 139 } 140 return 141 }