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  }