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

     1  package validatetpl
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"strconv"
     7  	"strings"
     8  )
     9  
    10  func GenerateRangeValidateFunc(str_type, str_param string, exc_min, exc_max bool) func(v interface{}) (bool, string) {
    11  	switch str_type {
    12  	case "uint8":
    13  		params := strings.Split(str_param, ",")
    14  		if len(params) == 2 {
    15  			min, err := strconv.ParseUint(params[0], 10, 8)
    16  			if err != nil {
    17  				min = 0
    18  			}
    19  			max, err := strconv.ParseUint(params[1], 10, 8)
    20  			if err != nil {
    21  				max = MAX_UINT8
    22  			}
    23  			return NewRangeValidateUint8(uint8(min), uint8(max), exc_min, exc_max)
    24  		}
    25  	case "int8":
    26  		params := strings.Split(str_param, ",")
    27  		if len(params) == 2 {
    28  			min, err := strconv.ParseInt(params[0], 10, 8)
    29  			if err != nil {
    30  				min = 0
    31  			}
    32  			max, err := strconv.ParseInt(params[1], 10, 8)
    33  			if err != nil {
    34  				max = MAX_INT8
    35  			}
    36  			return NewRangeValidateInt8(int8(min), int8(max), exc_min, exc_max)
    37  		}
    38  	case "uint16":
    39  		params := strings.Split(str_param, ",")
    40  		if len(params) == 2 {
    41  			min, err := strconv.ParseUint(params[0], 10, 16)
    42  			if err != nil {
    43  				min = 0
    44  			}
    45  			max, err := strconv.ParseUint(params[1], 10, 16)
    46  			if err != nil {
    47  				max = MAX_UINT16
    48  			}
    49  			return NewRangeValidateUint16(uint16(min), uint16(max), exc_min, exc_max)
    50  		}
    51  	case "int16":
    52  		params := strings.Split(str_param, ",")
    53  		if len(params) == 2 {
    54  			min, err := strconv.ParseInt(params[0], 10, 16)
    55  			if err != nil {
    56  				min = 0
    57  			}
    58  			max, err := strconv.ParseInt(params[1], 10, 16)
    59  			if err != nil {
    60  				max = MAX_INT16
    61  			}
    62  			return NewRangeValidateInt16(int16(min), int16(max), exc_min, exc_max)
    63  		}
    64  	case "uint32":
    65  		params := strings.Split(str_param, ",")
    66  		if len(params) == 2 {
    67  			min, err := strconv.ParseUint(params[0], 10, 32)
    68  			if err != nil {
    69  				min = 0
    70  			}
    71  			max, err := strconv.ParseUint(params[1], 10, 32)
    72  			if err != nil {
    73  				max = MAX_UINT32
    74  			}
    75  			return NewRangeValidateUint32(uint32(min), uint32(max), exc_min, exc_max)
    76  		}
    77  	case "int32":
    78  		params := strings.Split(str_param, ",")
    79  		if len(params) == 2 {
    80  			min, err := strconv.ParseInt(params[0], 10, 32)
    81  			if err != nil {
    82  				min = 0
    83  			}
    84  			max, err := strconv.ParseInt(params[1], 10, 32)
    85  			if err != nil {
    86  				max = MAX_INT32
    87  			}
    88  			return NewRangeValidateInt32(int32(min), int32(max), exc_min, exc_max)
    89  		}
    90  	case "uint64":
    91  		params := strings.Split(str_param, ",")
    92  		if len(params) == 2 {
    93  			min, err := strconv.ParseUint(params[0], 10, 64)
    94  			if err != nil {
    95  				min = 0
    96  			}
    97  			max, err := strconv.ParseUint(params[1], 10, 64)
    98  			if err != nil {
    99  				max = MAX_UINT64
   100  			}
   101  			return NewRangeValidateUint64(uint64(min), uint64(max), exc_min, exc_max)
   102  		}
   103  	case "int64":
   104  		params := strings.Split(str_param, ",")
   105  		if len(params) == 2 {
   106  			min, err := strconv.ParseInt(params[0], 10, 64)
   107  			if err != nil {
   108  				min = 0
   109  			}
   110  			max, err := strconv.ParseInt(params[1], 10, 64)
   111  			if err != nil {
   112  				max = MAX_INT64
   113  			}
   114  			return NewRangeValidateInt64(int64(min), int64(max), exc_min, exc_max)
   115  		}
   116  	case "float32":
   117  		params := strings.Split(str_param, ",")
   118  		if len(params) == 2 {
   119  			min, err := strconv.ParseFloat(params[0], 32)
   120  			if err != nil {
   121  				min = 0
   122  			}
   123  			max, err := strconv.ParseFloat(params[1], 32)
   124  			if err != nil {
   125  				panic(fmt.Sprintf("general range validate func failed[err:%s, tag:%s]", Float32NoDefaultMaxError, str_type))
   126  			}
   127  			return NewRangeValidateFloat32(float32(min), float32(max), exc_min, exc_max)
   128  		}
   129  	case "float64":
   130  		params := strings.Split(str_param, ",")
   131  		if len(params) == 2 {
   132  			min, err := strconv.ParseFloat(params[0], 64)
   133  			if err != nil {
   134  				min = 0
   135  			}
   136  			max, err := strconv.ParseFloat(params[1], 64)
   137  			if err != nil {
   138  				panic(fmt.Sprintf("general range validate func failed[err:%s, tag:%s]", Float64NoDefaultMaxError, str_type))
   139  			}
   140  			return NewRangeValidateFloat64(float64(min), float64(max), exc_min, exc_max)
   141  		}
   142  	case "string":
   143  		params := strings.Split(str_param, ",")
   144  		if len(params) == 2 {
   145  			min, err := strconv.ParseInt(params[0], 10, 0)
   146  			if err != nil {
   147  				min = 0
   148  			}
   149  
   150  			var max int64 = 0
   151  			if params[1] == UNLIMIT {
   152  				max = STRING_UNLIMIT_VALUE
   153  			} else {
   154  				max, err = strconv.ParseInt(params[1], 10, 0)
   155  				if err != nil {
   156  					max = DEFAULT_MAX_STRING_LENGTH
   157  				}
   158  			}
   159  			return NewValidateStringLength(int(min), int(max))
   160  		}
   161  	case "char":
   162  		params := strings.Split(str_param, ",")
   163  		if len(params) == 2 {
   164  			min, err := strconv.ParseInt(params[0], 10, 0)
   165  			if err != nil {
   166  				min = 0
   167  			}
   168  			max, err := strconv.ParseInt(params[1], 10, 0)
   169  			return NewValidateChar(int(min), int(max))
   170  		}
   171  	case "regexp":
   172  		reg, err := regexp.Compile(str_param)
   173  		if err == nil {
   174  			return NewValidateStringRegExp(reg)
   175  		}
   176  	default:
   177  		panic(fmt.Sprintf("general range validate func failed[err:%s, type:%s]", InvalidTypeStringError, str_type))
   178  	}
   179  	panic(fmt.Sprintf("general range validate func failed[err:%s, type:%s]", InvalidParamStringError, str_param))
   180  }
   181  
   182  func GenerateEnumValidateFunc(str_type, str_param string) func(v interface{}) (bool, string) {
   183  	switch str_type {
   184  	case "uint8":
   185  		params := strings.Split(str_param, ",")
   186  		enum_values := []uint8{}
   187  		for _, param := range params {
   188  			num, err := strconv.ParseUint(param, 10, 8)
   189  			if err != nil {
   190  				panic(fmt.Sprintf("general uint8 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   191  			}
   192  			enum_values = append(enum_values, uint8(num))
   193  		}
   194  		return NewEnumValidateUint8(enum_values...)
   195  	case "int8":
   196  		params := strings.Split(str_param, ",")
   197  		enum_values := []int8{}
   198  		for _, param := range params {
   199  			num, err := strconv.ParseInt(param, 10, 8)
   200  			if err != nil {
   201  				panic(fmt.Sprintf("general int8 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   202  			}
   203  			enum_values = append(enum_values, int8(num))
   204  		}
   205  		return NewEnumValidateInt8(enum_values...)
   206  	case "uint16":
   207  		params := strings.Split(str_param, ",")
   208  		enum_values := []uint16{}
   209  		for _, param := range params {
   210  			num, err := strconv.ParseUint(param, 10, 16)
   211  			if err != nil {
   212  				panic(fmt.Sprintf("general uint16 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   213  			}
   214  			enum_values = append(enum_values, uint16(num))
   215  		}
   216  		return NewEnumValidateUint16(enum_values...)
   217  	case "int16":
   218  		params := strings.Split(str_param, ",")
   219  		enum_values := []int16{}
   220  		for _, param := range params {
   221  			num, err := strconv.ParseInt(param, 10, 16)
   222  			if err != nil {
   223  				panic(fmt.Sprintf("general int16 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   224  			}
   225  			enum_values = append(enum_values, int16(num))
   226  		}
   227  		return NewEnumValidateInt16(enum_values...)
   228  	case "uint32":
   229  		params := strings.Split(str_param, ",")
   230  		enum_values := []uint32{}
   231  		for _, param := range params {
   232  			num, err := strconv.ParseUint(param, 10, 32)
   233  			if err != nil {
   234  				panic(fmt.Sprintf("general uint32 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   235  			}
   236  			enum_values = append(enum_values, uint32(num))
   237  		}
   238  		return NewEnumValidateUint32(enum_values...)
   239  	case "int32":
   240  		params := strings.Split(str_param, ",")
   241  		enum_values := []int32{}
   242  		for _, param := range params {
   243  			num, err := strconv.ParseInt(param, 10, 32)
   244  			if err != nil {
   245  				panic(fmt.Sprintf("general int32 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   246  			}
   247  			enum_values = append(enum_values, int32(num))
   248  		}
   249  		return NewEnumValidateInt32(enum_values...)
   250  	case "uint64":
   251  		params := strings.Split(str_param, ",")
   252  		enum_values := []uint64{}
   253  		for _, param := range params {
   254  			num, err := strconv.ParseUint(param, 10, 64)
   255  			if err != nil {
   256  				panic(fmt.Sprintf("general uint64 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   257  			}
   258  			enum_values = append(enum_values, uint64(num))
   259  		}
   260  		return NewEnumValidateUint64(enum_values...)
   261  	case "int64":
   262  		params := strings.Split(str_param, ",")
   263  		enum_values := []int64{}
   264  		for _, param := range params {
   265  			num, err := strconv.ParseInt(param, 10, 64)
   266  			if err != nil {
   267  				panic(fmt.Sprintf("general int64 enum validate func failed[err:%s, param:%s]", InvalidParamStringError, str_param))
   268  			}
   269  			enum_values = append(enum_values, int64(num))
   270  		}
   271  		return NewEnumValidateInt64(enum_values...)
   272  	case "string":
   273  		params := strings.Split(str_param, ",")
   274  		return NewEnumValidateString(params...)
   275  	default:
   276  		panic(fmt.Sprintf("general enum validate func failed[err:%s, type:%s]", InvalidTypeStringError, str_type))
   277  	}
   278  }
   279  
   280  func GenerateDecimalValidateFunc(str_type, str_param string) func(v interface{}) (bool, string) {
   281  	switch str_type {
   282  	case "float32":
   283  		params := strings.Split(str_param, ",")
   284  		if len(params) == 2 {
   285  			total_len, err := strconv.ParseUint(params[0], 10, 32)
   286  			if err != nil {
   287  				panic(fmt.Sprintf("general decimal validate func failed[err:%s, tag:%s]", InvalidTotalLenError, str_type))
   288  			}
   289  			decimal_len, err := strconv.ParseUint(params[1], 10, 32)
   290  			if err != nil {
   291  				panic(fmt.Sprintf("general decimal validate func failed[err:%s, tag:%s]", InvalidDecimalLenError, str_type))
   292  			}
   293  			if total_len > MAX_VALID_DIGIT_FLOAT32 {
   294  				panic(fmt.Sprintf("general decimal validate func failed[float32 valid len should not greater than %d]", MAX_VALID_DIGIT_FLOAT32))
   295  			} else if decimal_len > total_len {
   296  				panic(fmt.Sprintf("general decimal validate func failed[decimal len should not greater than total len[total:%d, decimal:%d]]",
   297  					total_len, decimal_len))
   298  			}
   299  			return NewDecimalValidateFloat32(int(total_len), int(decimal_len))
   300  		}
   301  	case "float64":
   302  		params := strings.Split(str_param, ",")
   303  		if len(params) == 2 {
   304  			total_len, err := strconv.ParseUint(params[0], 10, 32)
   305  			if err != nil {
   306  				panic(fmt.Sprintf("general range validate func failed[err:%s, tag:%s]", InvalidTotalLenError, str_type))
   307  			}
   308  			decimal_len, err := strconv.ParseUint(params[1], 10, 32)
   309  			if err != nil {
   310  				panic(fmt.Sprintf("general range validate func failed[err:%s, tag:%s]", InvalidDecimalLenError, str_type))
   311  			}
   312  			if total_len > MAX_VALID_DIGIT_FLOAT64 {
   313  				panic(fmt.Sprintf("general decimal validate func failed[float32 valid len should not greater than %d]", MAX_VALID_DIGIT_FLOAT32))
   314  			} else if decimal_len > total_len {
   315  				panic(fmt.Sprintf("general decimal validate func failed[decimal len should not greater than total len[total:%d, decimal:%d]]",
   316  					total_len, decimal_len))
   317  			}
   318  			return NewDecimalValidateFloat64(int(total_len), int(decimal_len))
   319  		}
   320  	default:
   321  		panic(fmt.Sprintf("general decimal validate func failed[err:%s, type:%s]", InvalidTypeStringError, str_type))
   322  	}
   323  	panic(fmt.Sprintf("general decimal validate func failed[err:%s, type:%s]", InvalidParamStringError, str_param))
   324  }
   325  func GenerateSliceValidateFunc(str_param, item_tag string) func(v interface{}) (bool, string) {
   326  	params := strings.Split(str_param, ",")
   327  	var min, max uint64
   328  	var err error
   329  	if len(params) == 2 {
   330  		min, err = strconv.ParseUint(params[0], 10, 64)
   331  		if err != nil {
   332  			min = 0
   333  		}
   334  		max, err = strconv.ParseUint(params[1], 10, 64)
   335  		if err != nil {
   336  			max = 0
   337  		}
   338  	}
   339  	return NewValidateSlice(min, max, GenerateValidateFuncByTag(item_tag))
   340  }
   341  
   342  func GenerateValidateFuncByTag(tag string) func(v interface{}) (bool, string) {
   343  	if regexp_range_except_float_tag.MatchString(tag) || regexp_reg_tag.MatchString(tag) {
   344  		param_start := strings.IndexAny(tag, "[(")
   345  		param_end := strings.LastIndexAny(tag, "])")
   346  		if param_start == -1 || param_end == -1 {
   347  			panic(fmt.Sprintf("generate range validate func failed[err:%s, tag:%s]", InvalidTagStringError, tag))
   348  		}
   349  
   350  		lb := tag[param_start : param_start+1]
   351  		rb := tag[param_end : param_end+1]
   352  		str_type := tag[1:param_start]
   353  		str_param := tag[param_start+1 : param_end]
   354  
   355  		exc_min := false
   356  		exc_max := false
   357  		if lb == "(" {
   358  			exc_min = true
   359  		}
   360  		if rb == ")" {
   361  			exc_max = true
   362  		}
   363  		return GenerateRangeValidateFunc(str_type, str_param, exc_min, exc_max)
   364  	} else if regexp_enum_tag.MatchString(tag) {
   365  		param_start := strings.IndexAny(tag, "{")
   366  		param_end := strings.LastIndexAny(tag, "}")
   367  		if param_start == -1 || param_end == -1 {
   368  			panic(fmt.Sprintf("generate enum validate func failed[err:%s, tag:%s]", InvalidTagStringError, tag))
   369  		}
   370  		str_type := tag[1:param_start]
   371  		str_param := tag[param_start+1 : param_end]
   372  		return GenerateEnumValidateFunc(str_type, str_param)
   373  	} else if regexp_array_tag.MatchString(tag) {
   374  		tags := strings.SplitN(tag, ":", 2)
   375  		if len(tags) != 2 {
   376  			//panic(fmt.Sprintf("generate slice validate func failed[err:%s, tag:%s]", InvalidTagStringError, tag))
   377  			tags = append(tags, "@")
   378  		}
   379  		array_tag := tags[0]
   380  		item_tag := tags[1]
   381  
   382  		param_start := strings.IndexAny(array_tag, "[")
   383  		param_end := strings.LastIndexAny(array_tag, "]")
   384  		if param_start == -1 || param_end == -1 {
   385  			panic(fmt.Sprintf("generate slice validate func failed[err:%s, tag:%s]", InvalidTagStringError, tag))
   386  		}
   387  		str_param := tag[param_start+1 : param_end]
   388  		return GenerateSliceValidateFunc(str_param, item_tag)
   389  	} else if regexp_range_float_tag.MatchString(tag) {
   390  		valideFuncList := []func(v interface{}) (bool, string){}
   391  		var param_start, param_end int
   392  		var str_type string
   393  		// float位数校验
   394  		if param_start = strings.IndexAny(tag, "<"); param_start != -1 {
   395  			param_end = strings.LastIndexAny(tag, ">")
   396  			if param_end == -1 {
   397  				panic(fmt.Sprintf("generate range validate func failed[err:%s, tag:%s]", InvalidTagStringError, tag))
   398  			}
   399  
   400  			str_type = tag[1:param_start]
   401  			str_param := tag[param_start+1 : param_end]
   402  			decimalValidFunc := GenerateDecimalValidateFunc(str_type, str_param)
   403  			if decimalValidFunc != nil {
   404  				valideFuncList = append(valideFuncList, decimalValidFunc)
   405  			}
   406  		}
   407  
   408  		// float值范围校验
   409  		if param_start = strings.IndexAny(tag, "[("); param_start != -1 {
   410  			param_end = strings.LastIndexAny(tag, "])")
   411  			if param_end == -1 {
   412  				panic(fmt.Sprintf("generate range validate func failed[err:%s, tag:%s]", InvalidTagStringError, tag))
   413  			}
   414  			// type string
   415  			if str_type == "" {
   416  				str_type = tag[1:param_start]
   417  			}
   418  			// param string
   419  			str_param := tag[param_start+1 : param_end]
   420  
   421  			exc_min := false
   422  			exc_max := false
   423  			if lb := tag[param_start : param_start+1]; lb == "(" {
   424  				exc_min = true
   425  			}
   426  			if rb := tag[param_end : param_end+1]; rb == ")" {
   427  				exc_max = true
   428  			}
   429  
   430  			rangeValidFunc := GenerateRangeValidateFunc(str_type, str_param, exc_min, exc_max)
   431  			if rangeValidFunc != nil {
   432  				valideFuncList = append(valideFuncList, rangeValidFunc)
   433  			}
   434  		}
   435  		return func(v interface{}) (bool, string) {
   436  			for _, validateFunc := range valideFuncList {
   437  				if ok, err_msg := validateFunc(v); !ok {
   438  					return false, err_msg
   439  				}
   440  			}
   441  			return true, ""
   442  		}
   443  	}
   444  
   445  	// 非Auto-Generate类型,从presetValidateFuncMap查询
   446  	if validateFunc, ok := GetValidateFunc(tag); ok {
   447  		return validateFunc
   448  	}
   449  	return nil
   450  }