From 056b574ce14f89a061a9d1aba08ef6319e73bd1d Mon Sep 17 00:00:00 2001 From: Elwin Tamminga Date: Tue, 1 Oct 2019 16:08:20 +0200 Subject: [PATCH] Add support for slices --- forms.go | 36 +++++++++++++++++++++++++----------- forms_test.go | 8 ++++++++ 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/forms.go b/forms.go index 664cab2..bcf3b48 100644 --- a/forms.go +++ b/forms.go @@ -79,19 +79,33 @@ func decode(form Values, rv reflect.Value, prefix string) { } } -func setValue(v []string, fv reflect.Value) { - switch f := fv.Interface().(type) { - case *string: - *f = v[0] - 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) +func setValue(values []string, fv reflect.Value) { + if fv.Elem().Type().Kind() != reflect.Slice { + parse(values[0], fv) + return } + 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 { diff --git a/forms_test.go b/forms_test.go index 928b2eb..2b94e73 100644 --- a/forms_test.go +++ b/forms_test.go @@ -15,6 +15,10 @@ type testStruct struct { PA *string PD *nested + + SA []string + SB []int + SC []float64 } type nested struct { @@ -46,6 +50,10 @@ func TestDecode(t *testing.T) { `PD.A`: {`test5`}, `PD.B`: {`30`}, `PD.C`: {`3.75`}, + + `SA`: {`test6`, `slice`}, + `SB`: {`3`, `2`}, + `SC`: {`4.50`, `1.32`}, }, data) fmt.Println(`data:`, data, *data.PA, *data.PD)