Skip to content

Commit 7d97147

Browse files
authored
Fix time.Duration translation error (#1154)
## Fixes Or Enhances This PR adds `time.Duration` translation and unit test cases. Connected to: #1069 **Make sure that you've checked the boxes below before you submit PR:** - [x] Tests exist or have been written that cover this particular change. @go-playground/validator-maintainers
1 parent 002f6c6 commit 7d97147

File tree

2 files changed

+73
-18
lines changed

2 files changed

+73
-18
lines changed

translations/en/en.go

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -217,17 +217,18 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
217217
customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
218218
var err error
219219
var t string
220-
220+
var f64 float64
221221
var digits uint64
222222
var kind reflect.Kind
223223

224-
if idx := strings.Index(fe.Param(), "."); idx != -1 {
225-
digits = uint64(len(fe.Param()[idx+1:]))
226-
}
224+
fn := func() (err error) {
225+
if idx := strings.Index(fe.Param(), "."); idx != -1 {
226+
digits = uint64(len(fe.Param()[idx+1:]))
227+
}
227228

228-
f64, err := strconv.ParseFloat(fe.Param(), 64)
229-
if err != nil {
230-
goto END
229+
f64, err = strconv.ParseFloat(fe.Param(), 64)
230+
231+
return
231232
}
232233

233234
kind = fe.Kind()
@@ -240,6 +241,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
240241

241242
var c string
242243

244+
err = fn()
245+
if err != nil {
246+
goto END
247+
}
248+
243249
c, err = ut.C("min-string-character", f64, digits, ut.FmtNumber(f64, digits))
244250
if err != nil {
245251
goto END
@@ -250,6 +256,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
250256
case reflect.Slice, reflect.Map, reflect.Array:
251257
var c string
252258

259+
err = fn()
260+
if err != nil {
261+
goto END
262+
}
263+
253264
c, err = ut.C("min-items-item", f64, digits, ut.FmtNumber(f64, digits))
254265
if err != nil {
255266
goto END
@@ -258,6 +269,16 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
258269
t, err = ut.T("min-items", fe.Field(), c)
259270

260271
default:
272+
if fe.Type() == reflect.TypeOf(time.Duration(0)) {
273+
t, err = ut.T("min-number", fe.Field(), fe.Param())
274+
goto END
275+
}
276+
277+
err = fn()
278+
if err != nil {
279+
goto END
280+
}
281+
261282
t, err = ut.T("min-number", fe.Field(), ut.FmtNumber(f64, digits))
262283
}
263284

@@ -305,17 +326,18 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
305326
customTransFunc: func(ut ut.Translator, fe validator.FieldError) string {
306327
var err error
307328
var t string
308-
329+
var f64 float64
309330
var digits uint64
310331
var kind reflect.Kind
311332

312-
if idx := strings.Index(fe.Param(), "."); idx != -1 {
313-
digits = uint64(len(fe.Param()[idx+1:]))
314-
}
333+
fn := func() (err error) {
334+
if idx := strings.Index(fe.Param(), "."); idx != -1 {
335+
digits = uint64(len(fe.Param()[idx+1:]))
336+
}
315337

316-
f64, err := strconv.ParseFloat(fe.Param(), 64)
317-
if err != nil {
318-
goto END
338+
f64, err = strconv.ParseFloat(fe.Param(), 64)
339+
340+
return
319341
}
320342

321343
kind = fe.Kind()
@@ -328,6 +350,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
328350

329351
var c string
330352

353+
err = fn()
354+
if err != nil {
355+
goto END
356+
}
357+
331358
c, err = ut.C("max-string-character", f64, digits, ut.FmtNumber(f64, digits))
332359
if err != nil {
333360
goto END
@@ -338,6 +365,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
338365
case reflect.Slice, reflect.Map, reflect.Array:
339366
var c string
340367

368+
err = fn()
369+
if err != nil {
370+
goto END
371+
}
372+
341373
c, err = ut.C("max-items-item", f64, digits, ut.FmtNumber(f64, digits))
342374
if err != nil {
343375
goto END
@@ -346,6 +378,16 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
346378
t, err = ut.T("max-items", fe.Field(), c)
347379

348380
default:
381+
if fe.Type() == reflect.TypeOf(time.Duration(0)) {
382+
t, err = ut.T("max-number", fe.Field(), fe.Param())
383+
goto END
384+
}
385+
386+
err = fn()
387+
if err != nil {
388+
goto END
389+
}
390+
349391
t, err = ut.T("max-number", fe.Field(), ut.FmtNumber(f64, digits))
350392
}
351393

translations/en/en_test.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,12 @@ func TestTranslations(t *testing.T) {
175175
Datetime string `validate:"datetime=2006-01-02"`
176176
PostCode string `validate:"postcode_iso3166_alpha2=SG"`
177177
PostCodeCountry string
178-
PostCodeByField string `validate:"postcode_iso3166_alpha2_field=PostCodeCountry"`
179-
BooleanString string `validate:"boolean"`
180-
Image string `validate:"image"`
181-
CveString string `validate:"cve"`
178+
PostCodeByField string `validate:"postcode_iso3166_alpha2_field=PostCodeCountry"`
179+
BooleanString string `validate:"boolean"`
180+
Image string `validate:"image"`
181+
CveString string `validate:"cve"`
182+
MinDuration time.Duration `validate:"min=1h30m,max=2h"`
183+
MaxDuration time.Duration `validate:"min=1h30m,max=2h"`
182184
}
183185

184186
var test Test
@@ -248,6 +250,9 @@ func TestTranslations(t *testing.T) {
248250
test.BooleanString = "A"
249251
test.CveString = "A"
250252

253+
test.MinDuration = 1 * time.Hour
254+
test.MaxDuration = 3 * time.Hour
255+
251256
test.Inner.RequiredIf = "abcd"
252257

253258
err = validate.Struct(test)
@@ -792,6 +797,14 @@ func TestTranslations(t *testing.T) {
792797
ns: "Test.CveString",
793798
expected: "CveString must be a valid cve identifier",
794799
},
800+
{
801+
ns: "Test.MinDuration",
802+
expected: "MinDuration must be 1h30m or greater",
803+
},
804+
{
805+
ns: "Test.MaxDuration",
806+
expected: "MaxDuration must be 2h or less",
807+
},
795808
}
796809

797810
for _, tt := range tests {

0 commit comments

Comments
 (0)