goyave.dev/goyave/v4@v4.4.11/validation/numeric.go (about) 1 package validation 2 3 import ( 4 "reflect" 5 "strconv" 6 "strings" 7 8 "goyave.dev/goyave/v4/util/typeutil" 9 ) 10 11 func validateNumeric(ctx *Context) bool { 12 rv := reflect.ValueOf(ctx.Value) 13 kind := rv.Kind().String() 14 switch { 15 case strings.HasPrefix(kind, "float"): 16 return true 17 case strings.HasPrefix(kind, "int"), strings.HasPrefix(kind, "uint") && kind != "uintptr": 18 floatVal, err := typeutil.ToFloat64(ctx.Value) 19 ok := err == nil 20 if ok { 21 ctx.Value = floatVal 22 } 23 return ok 24 case kind == "string": 25 floatVal, err := strconv.ParseFloat(ctx.Value.(string), 64) 26 ok := err == nil 27 if ok { 28 ctx.Value = floatVal 29 } 30 return ok 31 default: 32 return false 33 } 34 } 35 36 func validateInteger(ctx *Context) bool { 37 rv := reflect.ValueOf(ctx.Value) 38 kind := rv.Kind().String() 39 switch { 40 case strings.HasPrefix(kind, "int"), strings.HasPrefix(kind, "uint") && kind != "uintptr": 41 return true 42 case strings.HasPrefix(kind, "float"): 43 if kind == "float64" { 44 val, _ := ctx.Value.(float64) 45 if val-float64(int(val)) > 0 { 46 return false 47 } 48 ctx.Value = int(val) 49 return true 50 } 51 52 val, _ := ctx.Value.(float32) 53 if val-float32(int(val)) > 0 { 54 return false 55 } 56 ctx.Value = int(val) 57 return true 58 case kind == "string": 59 intVal, err := strconv.Atoi(ctx.Value.(string)) 60 if err == nil { 61 ctx.Value = intVal 62 } 63 return err == nil 64 default: 65 return false 66 } 67 }