fixed number settings 0 max validator
This commit is contained in:
+18
-6
@@ -2,7 +2,6 @@ package core
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
validation "github.com/go-ozzo/ozzo-validation/v4"
|
||||
@@ -23,6 +22,12 @@ var (
|
||||
_ SetterFinder = (*NumberField)(nil)
|
||||
)
|
||||
|
||||
var (
|
||||
onlyIntValidationError = validation.NewError("validation_only_int_constraint", "Decimal numbers are not allowed")
|
||||
minNumberValidationError = validation.NewError("validation_min_number_constraint", "Must be greater or equal than {{.min}}")
|
||||
maxNumberValidationError = validation.NewError("validation_max_number_constraint", "Must be less or equal than {{.max}}")
|
||||
)
|
||||
|
||||
// NumberField defines "number" type field for storing numeric (float64) value.
|
||||
//
|
||||
// The respective zero record field value is 0.
|
||||
@@ -151,15 +156,15 @@ func (f *NumberField) ValidateValue(ctx context.Context, app App, record *Record
|
||||
}
|
||||
|
||||
if f.OnlyInt && val != float64(int64(val)) {
|
||||
return validation.NewError("validation_only_int_constraint", "Decimal numbers are not allowed")
|
||||
return onlyIntValidationError
|
||||
}
|
||||
|
||||
if f.Min != nil && val < *f.Min {
|
||||
return validation.NewError("validation_min_number_constraint", fmt.Sprintf("Must be larger than %f", *f.Min))
|
||||
return minNumberValidationError.SetParams(map[string]any{"min": *f.Min})
|
||||
}
|
||||
|
||||
if f.Max != nil && val > *f.Max {
|
||||
return validation.NewError("validation_max_number_constraint", fmt.Sprintf("Must be less than %f", *f.Max))
|
||||
return maxNumberValidationError.SetParams(map[string]any{"max": *f.Max})
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -171,7 +176,14 @@ func (f *NumberField) ValidateSettings(ctx context.Context, app App, collection
|
||||
validation.By(f.checkOnlyInt),
|
||||
}
|
||||
if f.Min != nil && f.Max != nil {
|
||||
maxRules = append(maxRules, validation.Min(*f.Min))
|
||||
maxRules = append(maxRules, validation.By(func(value interface{}) error {
|
||||
// similar to validation.Min but doesn't ignore zero values
|
||||
v, _ := value.(*float64)
|
||||
if v == nil || f.Min == nil || *v >= *f.Min {
|
||||
return nil
|
||||
}
|
||||
return minNumberValidationError.SetParams(map[string]any{"min": *f.Min})
|
||||
}))
|
||||
}
|
||||
|
||||
return validation.ValidateStruct(f,
|
||||
@@ -190,7 +202,7 @@ func (f *NumberField) checkOnlyInt(value any) error {
|
||||
}
|
||||
|
||||
if *v != float64(int64(*v)) {
|
||||
return validation.NewError("validation_only_int_constraint", "Decimal numbers are not allowed.")
|
||||
return onlyIntValidationError
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user