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)
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}
}
return true, setSlice(vs, value, field)
case reflect.Array:
if !ok {
vs = []string{defaultValue}
}
return true, setArray(vs, value, field)
default:
var val string
if !ok {
@ -256,14 +261,22 @@ func setTimeField(val string, structField reflect.StructField, value reflect.Val
return nil
}
func setSlice(vals []string, value reflect.Value, field reflect.StructField) error {
slice := reflect.MakeSlice(value.Type(), len(vals), len(vals))
func setArray(vals []string, value reflect.Value, field reflect.StructField) error {
for i, s := range vals {
err := setWithProperType(s, slice.Index(i), field)
err := setWithProperType(s, value.Index(i), field)
if err != nil {
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)
return nil
}