add support time.Duration on mapping (#1794)
This commit is contained in:
		| @ -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 { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user