add support arrays on mapping (#1797)

* add support arrays on mapping

* not allow default value on array mapping
This commit is contained in:
Dmitry Kutakov
2019-03-14 08:34:56 +03:00
committed by 田欧
parent cab0749b4f
commit 483f828bce
2 changed files with 48 additions and 3 deletions

View File

@ -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
}