Add support for slices
This commit is contained in:
parent
122175c75b
commit
056b574ce1
36
forms.go
36
forms.go
@ -79,19 +79,33 @@ func decode(form Values, rv reflect.Value, prefix string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func setValue(v []string, fv reflect.Value) {
|
func setValue(values []string, fv reflect.Value) {
|
||||||
switch f := fv.Interface().(type) {
|
if fv.Elem().Type().Kind() != reflect.Slice {
|
||||||
case *string:
|
parse(values[0], fv)
|
||||||
*f = v[0]
|
return
|
||||||
case *int:
|
|
||||||
*f, _ = strconv.Atoi(v[0])
|
|
||||||
case *float32:
|
|
||||||
v, _ := strconv.ParseFloat(v[0], 32)
|
|
||||||
*f = float32(v)
|
|
||||||
case *float64:
|
|
||||||
*f, _ = strconv.ParseFloat(v[0], 64)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
slice := reflect.MakeSlice(fv.Elem().Type(), len(values), len(values))
|
||||||
|
val := reflect.New(slice.Type().Elem())
|
||||||
|
for i, v := range values {
|
||||||
|
parse(v, val)
|
||||||
|
slice.Index(i).Set(val.Elem())
|
||||||
|
}
|
||||||
|
fv.Elem().Set(slice)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parse(v string, fv reflect.Value) {
|
||||||
|
switch f := fv.Interface().(type) {
|
||||||
|
case *string:
|
||||||
|
*f = v
|
||||||
|
case *int:
|
||||||
|
*f, _ = strconv.Atoi(v)
|
||||||
|
case *float32:
|
||||||
|
v, _ := strconv.ParseFloat(v, 32)
|
||||||
|
*f = float32(v)
|
||||||
|
case *float64:
|
||||||
|
*f, _ = strconv.ParseFloat(v, 64)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPrefix(ft reflect.StructField, prefix string) string {
|
func getPrefix(ft reflect.StructField, prefix string) string {
|
||||||
|
@ -15,6 +15,10 @@ type testStruct struct {
|
|||||||
|
|
||||||
PA *string
|
PA *string
|
||||||
PD *nested
|
PD *nested
|
||||||
|
|
||||||
|
SA []string
|
||||||
|
SB []int
|
||||||
|
SC []float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type nested struct {
|
type nested struct {
|
||||||
@ -46,6 +50,10 @@ func TestDecode(t *testing.T) {
|
|||||||
`PD.A`: {`test5`},
|
`PD.A`: {`test5`},
|
||||||
`PD.B`: {`30`},
|
`PD.B`: {`30`},
|
||||||
`PD.C`: {`3.75`},
|
`PD.C`: {`3.75`},
|
||||||
|
|
||||||
|
`SA`: {`test6`, `slice`},
|
||||||
|
`SB`: {`3`, `2`},
|
||||||
|
`SC`: {`4.50`, `1.32`},
|
||||||
}, data)
|
}, data)
|
||||||
|
|
||||||
fmt.Println(`data:`, data, *data.PA, *data.PD)
|
fmt.Println(`data:`, data, *data.PA, *data.PD)
|
||||||
|
Loading…
Reference in New Issue
Block a user