1
0

hook.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package map2struct
  2. import (
  3. "github.com/mitchellh/mapstructure"
  4. "github.com/shopspring/decimal"
  5. "github.com/spf13/cast"
  6. "gopkg.in/guregu/null.v4"
  7. "reflect"
  8. "time"
  9. )
  10. var timeLocation *time.Location
  11. func init() {
  12. timeLocation, _ = time.LoadLocation("Asia/Shanghai")
  13. }
  14. func ToTimeHookFunc() mapstructure.DecodeHookFunc {
  15. return func(
  16. f reflect.Type,
  17. t reflect.Type,
  18. data interface{}) (interface{}, error) {
  19. if t != reflect.TypeOf(time.Time{}) {
  20. return data, nil
  21. }
  22. switch f.Kind() {
  23. case reflect.String:
  24. return cast.ToTimeInDefaultLocationE(data, timeLocation)
  25. case reflect.Float64:
  26. return time.Unix(0, int64(data.(float64))*int64(time.Millisecond)), nil
  27. case reflect.Int64:
  28. return time.Unix(0, data.(int64)*int64(time.Millisecond)), nil
  29. default:
  30. return data, nil
  31. }
  32. // Convert it by parsing
  33. }
  34. }
  35. func ToTimePtrHookFunc() mapstructure.DecodeHookFunc {
  36. return func(
  37. f reflect.Type,
  38. t reflect.Type,
  39. data interface{}) (interface{}, error) {
  40. if t != reflect.TypeOf(&time.Time{}) {
  41. return data, nil
  42. }
  43. switch f.Kind() {
  44. case reflect.String:
  45. if data == "" {
  46. return nil, nil
  47. }
  48. v, err := cast.ToTimeInDefaultLocationE(data, timeLocation)
  49. return &v, err
  50. case reflect.Float64:
  51. v := time.Unix(0, int64(data.(float64))*int64(time.Millisecond))
  52. return &v, nil
  53. case reflect.Int64:
  54. v := time.Unix(0, data.(int64)*int64(time.Millisecond))
  55. return &v, nil
  56. default:
  57. return data, nil
  58. }
  59. // Convert it by parsing
  60. }
  61. }
  62. func ToDecimalHookFunc() mapstructure.DecodeHookFunc {
  63. return func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
  64. if t == reflect.TypeOf(decimal.Decimal{}) {
  65. if f.Kind() == reflect.Float64 {
  66. return decimal.NewFromFloat(data.(float64)), nil
  67. }
  68. if input := data.(string); input != "" {
  69. return decimal.NewFromString(data.(string))
  70. }
  71. return decimal.Decimal{}, nil
  72. }
  73. return data, nil
  74. }
  75. }
  76. func ToNullableStringHookFunc() mapstructure.DecodeHookFunc {
  77. return func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
  78. if t == reflect.TypeOf(null.String{}) {
  79. return null.StringFrom(data.(string)), nil
  80. }
  81. return data, nil
  82. }
  83. }