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  }