gf/util/gvalid/gvalid_error.go

147 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2018 gf Author(https://github.com/gogf/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package gvalid
import "strings"
// 校验错误对象
type Error struct {
rules []string // 校验结果顺序(可能为nil),可保证返回校验错误的顺序性
errors ErrorMap // 完整的数据校验结果存储(map无序)
firstKey string // 第一条错误项键名(常用操作冗余数据),默认为空
firstItem map[string]string // 第一条错误项(常用操作冗余数据)默认为nil
}
// 校验错误信息: map[键名]map[规则名]错误信息
type ErrorMap map[string]map[string]string
// 创建一个校验错误对象指针(校验错误)
func newError(rules []string, errors map[string]map[string]string) *Error {
return &Error{
rules: rules,
errors: errors,
}
}
// 创建一个校验错误对象指针(内部错误)
func newErrorStr(key, err string) *Error {
return &Error{
rules: nil,
errors: map[string]map[string]string{
"__gvalid__": {
key: err,
},
},
}
}
// 获得规则与错误信息的map; 当校验结果为多条数据校验时返回第一条错误map(此时类似FirstItem)
func (e *Error) Map() map[string]string {
_, m := e.FirstItem()
return m
}
// 获得原始校验结果ErrorMap
func (e *Error) Maps() ErrorMap {
return e.errors
}
// 只获取第一个键名的校验错误项
func (e *Error) FirstItem() (key string, msgs map[string]string) {
if e.firstItem != nil {
return e.firstKey, e.firstItem
}
// 有序
if len(e.rules) > 0 {
for _, v := range e.rules {
name, _, _ := parseSequenceTag(v)
if m, ok := e.errors[name]; ok {
e.firstKey = name
e.firstItem = m
return name, m
}
}
}
// 无序
for k, m := range e.errors {
e.firstKey = k
e.firstItem = m
return k, m
}
return "", nil
}
// 只获取第一个校验错误项的规则及错误信息
func (e *Error) FirstRule() (rule string, err string) {
// 有序
if len(e.rules) > 0 {
for _, v := range e.rules {
name, rule, _ := parseSequenceTag(v)
if m, ok := e.errors[name]; ok {
for _, rule := range strings.Split(rule, "|") {
array := strings.Split(rule, ":")
rule = strings.TrimSpace(array[0])
if err, ok := m[rule]; ok {
return rule, err
}
}
}
}
}
// 无序
for _, m := range e.errors {
for k, v := range m {
return k, v
}
}
return "", ""
}
// 只获取第一个校验错误项的错误信息
func (e *Error) FirstString() (err string) {
_, err = e.FirstRule()
return
}
// 将所有错误信息构建称字符串,多个错误信息字符串使用"; "符号分隔
func (e *Error) String() string {
return strings.Join(e.Strings(), "; ")
}
// Error implements interface of error.Error.
func (e *Error) Error() string {
return e.String()
}
// 只返回错误信息,构造成字符串数组返回
func (e *Error) Strings() (errs []string) {
errs = make([]string, 0)
// 有序
if len(e.rules) > 0 {
for _, v := range e.rules {
name, rule, _ := parseSequenceTag(v)
if m, ok := e.errors[name]; ok {
for _, rule := range strings.Split(rule, "|") {
array := strings.Split(rule, ":")
rule = strings.TrimSpace(array[0])
if err, ok := m[rule]; ok {
errs = append(errs, err)
}
}
}
}
return errs
}
// 无序
for _, m := range e.errors {
for _, err := range m {
errs = append(errs, err)
}
}
return
}