null_bool.go 1.5 KB

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