null_uint64.go 1.5 KB

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