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.Error(t, err) | ||||||
| 	assert.Equal(t, errUnknownType, 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: | 	case reflect.Int32: | ||||||
| 		return setIntField(val, 32, value) | 		return setIntField(val, 32, value) | ||||||
| 	case reflect.Int64: | 	case reflect.Int64: | ||||||
|  | 		switch value.Interface().(type) { | ||||||
|  | 		case time.Duration: | ||||||
|  | 			return setTimeDuration(val, value, field) | ||||||
|  | 		} | ||||||
| 		return setIntField(val, 64, value) | 		return setIntField(val, 64, value) | ||||||
| 	case reflect.Uint: | 	case reflect.Uint: | ||||||
| 		return setUintField(val, 0, value) | 		return setUintField(val, 0, value) | ||||||
| @ -263,6 +267,15 @@ func setSlice(vals []string, value reflect.Value, field reflect.StructField) err | |||||||
| 	return nil | 	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) { | func head(str, sep string) (head string, tail string) { | ||||||
| 	idx := strings.Index(str, sep) | 	idx := strings.Index(str, sep) | ||||||
| 	if idx < 0 { | 	if idx < 0 { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user