From 5257bd38d1e50b5ecd95016f7bc74ed6eae09aa8 Mon Sep 17 00:00:00 2001 From: Alexander Lokhman Date: Tue, 14 Aug 2018 14:37:04 +0100 Subject: [PATCH] Add support for pointers for time fields in form mapping --- binding/form_mapping.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/binding/form_mapping.go b/binding/form_mapping.go index 3f6b9bfa..52974eb6 100644 --- a/binding/form_mapping.go +++ b/binding/form_mapping.go @@ -69,19 +69,13 @@ func mapForm(ptr interface{}, form map[string][]string) error { sliceOf := structField.Type().Elem().Kind() slice := reflect.MakeSlice(structField.Type(), numElems, numElems) for i := 0; i < numElems; i++ { - if err := setWithProperType(sliceOf, inputValue[i], slice.Index(i)); err != nil { + if err := setWithProperType(sliceOf, inputValue[i], slice.Index(i), typeField); err != nil { return err } } val.Field(i).Set(slice) } else { - if _, isTime := structField.Interface().(time.Time); isTime { - if err := setTimeField(inputValue[0], typeField, structField); err != nil { - return err - } - continue - } - if err := setWithProperType(typeField.Type.Kind(), inputValue[0], structField); err != nil { + if err := setWithProperType(typeField.Type.Kind(), inputValue[0], structField, typeField); err != nil { return err } } @@ -89,7 +83,7 @@ func mapForm(ptr interface{}, form map[string][]string) error { return nil } -func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value) error { +func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, typeField reflect.StructField) error { switch valueKind { case reflect.Int: return setIntField(val, 0, structField) @@ -124,7 +118,12 @@ func setWithProperType(valueKind reflect.Kind, val string, structField reflect.V structField.Set(reflect.New(structField.Type().Elem())) } structFieldElem := structField.Elem() - return setWithProperType(structFieldElem.Kind(), val, structFieldElem) + return setWithProperType(structFieldElem.Kind(), val, structFieldElem, typeField) + case reflect.Struct: + if _, isTime := structField.Interface().(time.Time); isTime { + return setTimeField(val, typeField, structField) + } + fallthrough default: return errors.New("Unknown type") }