null_string.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package xorm
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. )
  7. type NullString struct {
  8. String string
  9. Valid bool
  10. }
  11. func (ns NullString) Ptr() *string {
  12. if !ns.Valid {
  13. return nil
  14. }
  15. return &ns.String
  16. }
  17. func (ns NullString) ValueOrZero() string {
  18. if !ns.Valid {
  19. return ""
  20. }
  21. return ns.String
  22. }
  23. func (ns NullString) IsNil() bool {
  24. return !ns.Valid
  25. }
  26. func (ns *NullString) UnmarshalJSON(data []byte) error {
  27. var err error
  28. var v interface{}
  29. if err = json.Unmarshal(data, &v); err != nil {
  30. return err
  31. }
  32. switch x := v.(type) {
  33. case string:
  34. ns.String = x
  35. case map[string]interface{}:
  36. err = json.Unmarshal(data, &ns)
  37. case nil:
  38. ns.Valid = false
  39. return nil
  40. default:
  41. err = fmt.Errorf("json: cannot unmarshal %v into Go value of type xorm.NullString", reflect.TypeOf(v).Name())
  42. }
  43. ns.Valid = err == nil
  44. return err
  45. }
  46. func (ns NullString) MarshalJSON() ([]byte, error) {
  47. if !ns.Valid {
  48. return []byte("null"), nil
  49. }
  50. return json.Marshal(ns.String)
  51. }
  52. func (ns NullString) MarshalText() ([]byte, error) {
  53. if !ns.Valid {
  54. return []byte{}, nil
  55. }
  56. return []byte(ns.String), nil
  57. }
  58. func (ns *NullString) UnmarshalText(text []byte) error {
  59. ns.String = string(text)
  60. ns.Valid = ns.String != ""
  61. return nil
  62. }