mirror of https://github.com/gin-gonic/gin.git
add support time.Duration on mapping (#1794)
This commit is contained in:
parent
f8f1459619
commit
805b2d4904
|
@ -1413,3 +1413,20 @@ func TestBindingUnknownTypeChan(t *testing.T) {
|
|||
assert.Error(t, err)
|
||||
assert.Equal(t, errUnknownType, err)
|
||||
}
|
||||
|
||||
func TestBindingTimeDuration(t *testing.T) {
|
||||
var s struct {
|
||||
Timeout time.Duration `form:"timeout"`
|
||||
}
|
||||
|
||||
// ok
|
||||
req := formPostRequest("", "timeout=5s")
|
||||
err := Form.Bind(req, &s)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 5*time.Second, s.Timeout)
|
||||
|
||||
// error
|
||||
req = formPostRequest("", "timeout=wrong")
|
||||
err = Form.Bind(req, &s)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
|
|
@ -141,6 +141,10 @@ func setWithProperType(val string, value reflect.Value, field reflect.StructFiel
|
|||
case reflect.Int32:
|
||||
return setIntField(val, 32, value)
|
||||
case reflect.Int64:
|
||||
switch value.Interface().(type) {
|
||||
case time.Duration:
|
||||
return setTimeDuration(val, value, field)
|
||||
}
|
||||
return setIntField(val, 64, value)
|
||||
case reflect.Uint:
|
||||
return setUintField(val, 0, value)
|
||||
|
@ -263,6 +267,15 @@ func setSlice(vals []string, value reflect.Value, field reflect.StructField) err
|
|||
return nil
|
||||
}
|
||||
|
||||
func setTimeDuration(val string, value reflect.Value, field reflect.StructField) error {
|
||||
d, err := time.ParseDuration(val)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
value.Set(reflect.ValueOf(d))
|
||||
return nil
|
||||
}
|
||||
|
||||
func head(str, sep string) (head string, tail string) {
|
||||
idx := strings.Index(str, sep)
|
||||
if idx < 0 {
|
||||
|
|
Loading…
Reference in New Issue