diff --git a/translations/en/en.go b/translations/en/en.go index 9cef10ee3..aa9df7ed0 100644 --- a/translations/en/en.go +++ b/translations/en/en.go @@ -217,17 +217,18 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er customTransFunc: func(ut ut.Translator, fe validator.FieldError) string { var err error var t string - + var f64 float64 var digits uint64 var kind reflect.Kind - if idx := strings.Index(fe.Param(), "."); idx != -1 { - digits = uint64(len(fe.Param()[idx+1:])) - } + fn := func() (err error) { + if idx := strings.Index(fe.Param(), "."); idx != -1 { + digits = uint64(len(fe.Param()[idx+1:])) + } - f64, err := strconv.ParseFloat(fe.Param(), 64) - if err != nil { - goto END + f64, err = strconv.ParseFloat(fe.Param(), 64) + + return } kind = fe.Kind() @@ -240,6 +241,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er var c string + err = fn() + if err != nil { + goto END + } + c, err = ut.C("min-string-character", f64, digits, ut.FmtNumber(f64, digits)) if err != nil { goto END @@ -250,6 +256,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er case reflect.Slice, reflect.Map, reflect.Array: var c string + err = fn() + if err != nil { + goto END + } + c, err = ut.C("min-items-item", f64, digits, ut.FmtNumber(f64, digits)) if err != nil { goto END @@ -258,6 +269,16 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er t, err = ut.T("min-items", fe.Field(), c) default: + if fe.Type() == reflect.TypeOf(time.Duration(0)) { + t, err = ut.T("min-number", fe.Field(), fe.Param()) + goto END + } + + err = fn() + if err != nil { + goto END + } + t, err = ut.T("min-number", fe.Field(), ut.FmtNumber(f64, digits)) } @@ -305,17 +326,18 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er customTransFunc: func(ut ut.Translator, fe validator.FieldError) string { var err error var t string - + var f64 float64 var digits uint64 var kind reflect.Kind - if idx := strings.Index(fe.Param(), "."); idx != -1 { - digits = uint64(len(fe.Param()[idx+1:])) - } + fn := func() (err error) { + if idx := strings.Index(fe.Param(), "."); idx != -1 { + digits = uint64(len(fe.Param()[idx+1:])) + } - f64, err := strconv.ParseFloat(fe.Param(), 64) - if err != nil { - goto END + f64, err = strconv.ParseFloat(fe.Param(), 64) + + return } kind = fe.Kind() @@ -328,6 +350,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er var c string + err = fn() + if err != nil { + goto END + } + c, err = ut.C("max-string-character", f64, digits, ut.FmtNumber(f64, digits)) if err != nil { goto END @@ -338,6 +365,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er case reflect.Slice, reflect.Map, reflect.Array: var c string + err = fn() + if err != nil { + goto END + } + c, err = ut.C("max-items-item", f64, digits, ut.FmtNumber(f64, digits)) if err != nil { goto END @@ -346,6 +378,16 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er t, err = ut.T("max-items", fe.Field(), c) default: + if fe.Type() == reflect.TypeOf(time.Duration(0)) { + t, err = ut.T("max-number", fe.Field(), fe.Param()) + goto END + } + + err = fn() + if err != nil { + goto END + } + t, err = ut.T("max-number", fe.Field(), ut.FmtNumber(f64, digits)) } diff --git a/translations/en/en_test.go b/translations/en/en_test.go index e5d397eca..c3de21853 100644 --- a/translations/en/en_test.go +++ b/translations/en/en_test.go @@ -175,10 +175,12 @@ func TestTranslations(t *testing.T) { Datetime string `validate:"datetime=2006-01-02"` PostCode string `validate:"postcode_iso3166_alpha2=SG"` PostCodeCountry string - PostCodeByField string `validate:"postcode_iso3166_alpha2_field=PostCodeCountry"` - BooleanString string `validate:"boolean"` - Image string `validate:"image"` - CveString string `validate:"cve"` + PostCodeByField string `validate:"postcode_iso3166_alpha2_field=PostCodeCountry"` + BooleanString string `validate:"boolean"` + Image string `validate:"image"` + CveString string `validate:"cve"` + MinDuration time.Duration `validate:"min=1h30m,max=2h"` + MaxDuration time.Duration `validate:"min=1h30m,max=2h"` } var test Test @@ -248,6 +250,9 @@ func TestTranslations(t *testing.T) { test.BooleanString = "A" test.CveString = "A" + test.MinDuration = 1 * time.Hour + test.MaxDuration = 3 * time.Hour + test.Inner.RequiredIf = "abcd" err = validate.Struct(test) @@ -792,6 +797,14 @@ func TestTranslations(t *testing.T) { ns: "Test.CveString", expected: "CveString must be a valid cve identifier", }, + { + ns: "Test.MinDuration", + expected: "MinDuration must be 1h30m or greater", + }, + { + ns: "Test.MaxDuration", + expected: "MaxDuration must be 2h or less", + }, } for _, tt := range tests {