hook.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package map2struct
  2. import (
  3. "github.com/mitchellh/mapstructure"
  4. "github.com/shopspring/decimal"
  5. "github.com/spf13/cast"
  6. "reflect"
  7. "time"
  8. )
  9. var timeLocation *time.Location
  10. func init() {
  11. timeLocation = time.Local
  12. }
  13. func ToTimeHookFunc() mapstructure.DecodeHookFunc {
  14. return func(
  15. f reflect.Type,
  16. t reflect.Type,
  17. data interface{}) (interface{}, error) {
  18. if t != reflect.TypeOf(time.Time{}) {
  19. return data, nil
  20. }
  21. switch f.Kind() {
  22. case reflect.String:
  23. return cast.ToTimeInDefaultLocationE(data, timeLocation)
  24. case reflect.Float64:
  25. return time.Unix(0, int64(data.(float64))*int64(time.Millisecond)), nil
  26. case reflect.Int64:
  27. return time.Unix(0, data.(int64)*int64(time.Millisecond)), nil
  28. default:
  29. return data, nil
  30. }
  31. // Convert it by parsing
  32. }
  33. }
  34. func ToDecimalHookFunc() mapstructure.DecodeHookFunc {
  35. return func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
  36. if t == reflect.TypeOf(decimal.Decimal{}) {
  37. if f.Kind() == reflect.Float64 {
  38. return decimal.NewFromFloat(data.(float64)), nil
  39. }
  40. if input := data.(string); input != "" {
  41. return decimal.NewFromString(data.(string))
  42. }
  43. return decimal.Decimal{}, nil
  44. }
  45. return data, nil
  46. }
  47. }