null_int.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package xorm
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "strconv"
  7. )
  8. type NullInt struct {
  9. Int int
  10. Valid bool
  11. }
  12. func (ni NullInt) Ptr() *int {
  13. if !ni.Valid {
  14. return nil
  15. }
  16. return &ni.Int
  17. }
  18. func (ni NullInt) ValueOrZero() int {
  19. if !ni.Valid {
  20. return 0
  21. }
  22. return ni.Int
  23. }
  24. func (ni NullInt) IsNil() bool {
  25. return !ni.Valid
  26. }
  27. func (ni *NullInt) UnmarshalJSON(data []byte) error {
  28. var err error
  29. var v interface{}
  30. if err = json.Unmarshal(data, &v); err != nil {
  31. return err
  32. }
  33. switch x := v.(type) {
  34. case float64:
  35. err = json.Unmarshal(data, &ni.Int)
  36. case string:
  37. str := string(x)
  38. if len(str) == 0 {
  39. ni.Valid = false
  40. return nil
  41. }
  42. ni.Int, err = strconv.Atoi(string(str))
  43. case map[string]interface{}:
  44. err = json.Unmarshal(data, &ni)
  45. case nil:
  46. ni.Valid = false
  47. return nil
  48. default:
  49. err = fmt.Errorf("json: cannot unmarshal %v into Go value of type xorm.NullInt", reflect.TypeOf(v).Name())
  50. }
  51. ni.Valid = err == nil
  52. return err
  53. }
  54. func (ni *NullInt) UnmarshalText(text []byte) error {
  55. str := string(text)
  56. if str == "" || str == "null" {
  57. ni.Valid = false
  58. return nil
  59. }
  60. var err error
  61. ni.Int, err = strconv.Atoi(string(text))
  62. ni.Valid = err == nil
  63. return err
  64. }
  65. func (ni NullInt) MarshalJSON() ([]byte, error) {
  66. if !ni.Valid {
  67. return []byte("null"), nil
  68. }
  69. return []byte(strconv.Itoa(ni.Int)), nil
  70. }
  71. func (ni NullInt) MarshalText() ([]byte, error) {
  72. if !ni.Valid {
  73. return []byte{}, nil
  74. }
  75. return []byte(strconv.Itoa(ni.Int)), nil
  76. }