Skip to content

Commit 6639fd9

Browse files
committed
add support arrays on mapping
1 parent 057f63b commit 6639fd9

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

binding/binding_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -1430,3 +1430,20 @@ func TestBindingTimeDuration(t *testing.T) {
14301430
err = Form.Bind(req, &s)
14311431
assert.Error(t, err)
14321432
}
1433+
1434+
func TestBindingArray(t *testing.T) {
1435+
var s struct {
1436+
Nums [2]int `form:"nums"`
1437+
}
1438+
1439+
// ok
1440+
req := formPostRequest("", "nums=3&nums=8")
1441+
err := Form.Bind(req, &s)
1442+
assert.NoError(t, err)
1443+
assert.Equal(t, [2]int{3, 8}, s.Nums)
1444+
1445+
// error
1446+
req = formPostRequest("", "nums=wrong")
1447+
err = Form.Bind(req, &s)
1448+
assert.Error(t, err)
1449+
}

binding/form_mapping.go

+16-3
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ func tryToSetValue(value reflect.Value, field reflect.StructField, form map[stri
118118
vs = []string{defaultValue}
119119
}
120120
return true, setSlice(vs, value, field)
121+
case reflect.Array:
122+
if !ok {
123+
vs = []string{defaultValue}
124+
}
125+
return true, setArray(vs, value, field)
121126
default:
122127
var val string
123128
if !ok {
@@ -256,14 +261,22 @@ func setTimeField(val string, structField reflect.StructField, value reflect.Val
256261
return nil
257262
}
258263

259-
func setSlice(vals []string, value reflect.Value, field reflect.StructField) error {
260-
slice := reflect.MakeSlice(value.Type(), len(vals), len(vals))
264+
func setArray(vals []string, value reflect.Value, field reflect.StructField) error {
261265
for i, s := range vals {
262-
err := setWithProperType(s, slice.Index(i), field)
266+
err := setWithProperType(s, value.Index(i), field)
263267
if err != nil {
264268
return err
265269
}
266270
}
271+
return nil
272+
}
273+
274+
func setSlice(vals []string, value reflect.Value, field reflect.StructField) error {
275+
slice := reflect.MakeSlice(value.Type(), len(vals), len(vals))
276+
err := setArray(vals, slice, field)
277+
if err != nil {
278+
return err
279+
}
267280
value.Set(slice)
268281
return nil
269282
}

0 commit comments

Comments
 (0)