add support arrays on mapping

This commit is contained in:
Dmitry Kutakov 2019-03-05 20:16:29 +03:00
parent 057f63b1bb
commit 0450799407
2 changed files with 39 additions and 3 deletions

View File

@ -1430,3 +1430,26 @@ func TestBindingTimeDuration(t *testing.T) {
err = Form.Bind(req, &s) err = Form.Bind(req, &s)
assert.Error(t, err) assert.Error(t, err)
} }
func TestBindingArray(t *testing.T) {
var s struct {
Nums [2]int `form:"nums,default=4"`
}
// default
req := formPostRequest("", "")
err := Form.Bind(req, &s)
assert.NoError(t, err)
assert.Equal(t, [2]int{4, 0}, s.Nums)
// ok
req = formPostRequest("", "nums=3&nums=8")
err = Form.Bind(req, &s)
assert.NoError(t, err)
assert.Equal(t, [2]int{3, 8}, s.Nums)
// error
req = formPostRequest("", "nums=wrong")
err = Form.Bind(req, &s)
assert.Error(t, err)
}

View File

@ -118,6 +118,11 @@ func tryToSetValue(value reflect.Value, field reflect.StructField, form map[stri
vs = []string{defaultValue} vs = []string{defaultValue}
} }
return true, setSlice(vs, value, field) return true, setSlice(vs, value, field)
case reflect.Array:
if !ok {
vs = []string{defaultValue}
}
return true, setArray(vs, value, field)
default: default:
var val string var val string
if !ok { if !ok {
@ -256,14 +261,22 @@ func setTimeField(val string, structField reflect.StructField, value reflect.Val
return nil return nil
} }
func setSlice(vals []string, value reflect.Value, field reflect.StructField) error { func setArray(vals []string, value reflect.Value, field reflect.StructField) error {
slice := reflect.MakeSlice(value.Type(), len(vals), len(vals))
for i, s := range vals { for i, s := range vals {
err := setWithProperType(s, slice.Index(i), field) err := setWithProperType(s, value.Index(i), field)
if err != nil { if err != nil {
return err return err
} }
} }
return nil
}
func setSlice(vals []string, value reflect.Value, field reflect.StructField) error {
slice := reflect.MakeSlice(value.Type(), len(vals), len(vals))
err := setArray(vals, slice, field)
if err != nil {
return err
}
value.Set(slice) value.Set(slice)
return nil return nil
} }