Support time.Time on form binding (#801)
This commit is contained in:
		| @ -8,6 +8,7 @@ import ( | ||||
| 	"errors" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func mapForm(ptr interface{}, form map[string][]string) error { | ||||
| @ -52,6 +53,12 @@ func mapForm(ptr interface{}, form map[string][]string) error { | ||||
| 			} | ||||
| 			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 { | ||||
| 				return err | ||||
| 			} | ||||
| @ -140,6 +147,26 @@ func setFloatField(val string, bitSize int, field reflect.Value) error { | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func setTimeField(val string, structField reflect.StructField, value reflect.Value) error { | ||||
| 	timeFormat := structField.Tag.Get("time_format") | ||||
| 	if timeFormat == "" { | ||||
| 		return errors.New("Blank time format") | ||||
| 	} | ||||
|  | ||||
| 	l := time.Local | ||||
| 	if isUTC, _ := strconv.ParseBool(structField.Tag.Get("time_utc")); isUTC { | ||||
| 		l = time.UTC | ||||
| 	} | ||||
|  | ||||
| 	t, err := time.ParseInLocation(timeFormat, val, l) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	value.Set(reflect.ValueOf(t)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Don't pass in pointers to bind to. Can lead to bugs. See: | ||||
| // https://github.com/codegangsta/martini-contrib/issues/40 | ||||
| // https://github.com/codegangsta/martini-contrib/pull/34#issuecomment-29683659 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user