add support arrays on mapping (#1797)
* add support arrays on mapping * not allow default value on array mapping
This commit is contained in:
		| @ -1430,3 +1430,31 @@ 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.Error(t, err) | ||||
| 	assert.Equal(t, [2]int{0, 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) | ||||
|  | ||||
| 	// not enough vals | ||||
| 	req = formPostRequest("", "nums=3") | ||||
| 	err = Form.Bind(req, &s) | ||||
| 	assert.Error(t, err) | ||||
|  | ||||
| 	// error | ||||
| 	req = formPostRequest("", "nums=3&nums=wrong") | ||||
| 	err = Form.Bind(req, &s) | ||||
| 	assert.Error(t, err) | ||||
| } | ||||
|  | ||||
| @ -6,6 +6,7 @@ package binding | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| @ -118,6 +119,14 @@ 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} | ||||
| 		} | ||||
| 		if len(vs) != value.Len() { | ||||
| 			return false, fmt.Errorf("%q is not valid value for %s", vs, value.Type().String()) | ||||
| 		} | ||||
| 		return true, setArray(vs, value, field) | ||||
| 	default: | ||||
| 		var val string | ||||
| 		if !ok { | ||||
| @ -256,14 +265,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 | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user