github.com/profzone/eden-framework@v1.0.10/pkg/validate/validatetpl/def.go (about)

     1  package validatetpl
     2  
     3  import (
     4  	"errors"
     5  	"reflect"
     6  	"regexp"
     7  )
     8  
     9  const (
    10  	MAX_UINT8  = 1<<8 - 1
    11  	MAX_INT8   = 1<<7 - 1
    12  	MAX_UINT16 = 1<<16 - 1
    13  	MAX_INT16  = 1<<15 - 1
    14  	MAX_UINT32 = 1<<32 - 1
    15  	MAX_INT32  = 1<<31 - 1
    16  	//MAX_UINT64 = 1<<64 - 1
    17  	MAX_UINT64 = 1<<63 - 1 // 兼容mysql driver只支持MAX 1<<63-1
    18  	//MAX_INT64 = 1<<63 - 1
    19  	MAX_INT64 = 1<<53 - 1 // 兼容浏览器只支持MAX 2<<53-1
    20  	// floa32最大有效位数
    21  	MAX_VALID_DIGIT_FLOAT32 = 7
    22  	// floa64最大有效位数
    23  	MAX_VALID_DIGIT_FLOAT64 = 15
    24  )
    25  const (
    26  	DEFAULT_MAX_STRING_LENGTH = 1024
    27  )
    28  const (
    29  	STRING_CHARS_NOT_IN_RANGE   = "字符串字数不在[%d, %d]范围内,当前长度: %d"
    30  	STRING_LENGHT_NOT_IN_RANGE  = "字符串长度不在[%d, %d]范围内,当前长度:%d"
    31  	STRING_VALUE_NOT_IN_ENUM    = "字符串不在%v集合内,当前值:%s"
    32  	STRING_NOT_MATCH_REGEXP     = "字符串不符合正则表达式[%s]"
    33  	INT_VALUE_NOT_IN_RANGE      = "整形值不在%s%d, %d%s范围内,当前值:%d"
    34  	INT_VALUE_NOT_IN_ENUM       = "整形值不在%v集合内,当前值:%d"
    35  	FLOAT_VALUE_NOT_IN_RANGE    = "浮点值不在%s%v,%v%s范围内,当前值:%v"
    36  	FLOAT_VALUE_NOT_IN_ENUM     = "浮点值不在%v集合内,当前值:%v"
    37  	FLOAT_VALUE_DIGIT_INVALID   = "浮点值小数位必须为%d,总位数不能超过%d位,当前值:%v"
    38  	SLICE_ELEM_NUM_NOT_IN_RANGE = "切片元素个数不在[%d, %d]范围内,当前个数:%d"
    39  	SLICE_ELEM_INVALID          = "切片元素不满足校验[%s]"
    40  )
    41  const (
    42  	TYPE_NOT_STRING  = "非string类型"
    43  	TYPE_NOT_UINT8   = "非uint8类型"
    44  	TYPE_NOT_INT8    = "非int8类型"
    45  	TYPE_NOT_UINT16  = "非uint16类型"
    46  	TYPE_NOT_INT16   = "非int16类型"
    47  	TYPE_NOT_UINT32  = "非uint32类型"
    48  	TYPE_NOT_INT32   = "非int32类型"
    49  	TYPE_NOT_UINT64  = "非uint64类型"
    50  	TYPE_NOT_INT64   = "非int64类型"
    51  	TYPE_NOT_FLOAT32 = "非float32类型"
    52  	TYPE_NOT_FLOAT64 = "非float64类型"
    53  	TYPE_NOT_SLICE   = "非slice类型"
    54  )
    55  
    56  const (
    57  	UNLIMIT              = "unlimit"
    58  	STRING_UNLIMIT_VALUE = -1
    59  )
    60  
    61  var (
    62  	InvalidTypeStringError   = errors.New("invalid type string error")
    63  	InvalidParamStringError  = errors.New("invalid param string error")
    64  	InvalidTagStringError    = errors.New("invalid tag string error")
    65  	Float32NoDefaultMaxError = errors.New("float32 no default max error")
    66  	Float64NoDefaultMaxError = errors.New("float64 no default max error")
    67  	InvalidTotalLenError     = errors.New("invalid total length error")
    68  	InvalidDecimalLenError   = errors.New("invalid decimal length error")
    69  )
    70  
    71  var regexp_range_except_float_tag = regexp.MustCompile(`^@(int8|uint8|int16|uint16|int32|uint32|int64|uint64|string|char)(\[|\()\-?\d*\,|unlimit\-?\d*(\]|\))$`)
    72  
    73  var regexp_range_float_tag = regexp.MustCompile(`^@(float32|float64)(\<\d*\,\d*\>)?((\[|\()-?\d*(\.\d*)?\,-?\d*(\.\d*)?(\]|\)))?$`)
    74  
    75  var regexp_reg_tag = regexp.MustCompile(`^@regexp\[.+\]`)
    76  
    77  var regexp_enum_tag = regexp.MustCompile(`^@(uint8|int8|uint16|int16|uint32|int32|uint64|int64|float32|float64|string)\{\w*(\,\w+)*\}$`)
    78  
    79  var regexp_array_tag = regexp.MustCompile(`^@array(\[|\()\-?\d*\,\-?\d*(\]|\))(:@.*)?$`)
    80  
    81  func getBrackets(exc_min, exc_max bool) (left_brackets, right_brackets string) {
    82  	left_brackets = "["
    83  	right_brackets = "]"
    84  	if exc_min {
    85  		left_brackets = "("
    86  	}
    87  	if exc_max {
    88  		right_brackets = ")"
    89  	}
    90  	return
    91  }
    92  
    93  func indirect(v reflect.Value) reflect.Value {
    94  	for {
    95  		if v.Kind() == reflect.Interface {
    96  			e := v.Elem()
    97  			if e.Kind() == reflect.Ptr {
    98  				v = e
    99  				continue
   100  			}
   101  		}
   102  
   103  		if v.Kind() != reflect.Ptr {
   104  			break
   105  		}
   106  		v = v.Elem()
   107  	}
   108  
   109  	return v
   110  }