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 }