status.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package tunnel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "strings"
  6. "sync/atomic"
  7. )
  8. type TunnelStatus int
  9. // StatusMapping is a mapping for Status enum
  10. var StatusMapping = map[string]TunnelStatus{
  11. Suspend.String(): Suspend,
  12. Inner.String(): Inner,
  13. Running.String(): Running,
  14. }
  15. const (
  16. Suspend TunnelStatus = iota
  17. Inner
  18. Running
  19. )
  20. // UnmarshalJSON unserialize Status
  21. func (s *TunnelStatus) UnmarshalJSON(data []byte) error {
  22. var tp string
  23. json.Unmarshal(data, &tp)
  24. status, exist := StatusMapping[strings.ToLower(tp)]
  25. if !exist {
  26. return errors.New("invalid mode")
  27. }
  28. *s = status
  29. return nil
  30. }
  31. // UnmarshalYAML unserialize Status with yaml
  32. func (s *TunnelStatus) UnmarshalYAML(unmarshal func(any) error) error {
  33. var tp string
  34. unmarshal(&tp)
  35. status, exist := StatusMapping[strings.ToLower(tp)]
  36. if !exist {
  37. return errors.New("invalid status")
  38. }
  39. *s = status
  40. return nil
  41. }
  42. // MarshalJSON serialize Status
  43. func (s TunnelStatus) MarshalJSON() ([]byte, error) {
  44. return json.Marshal(s.String())
  45. }
  46. // MarshalYAML serialize TunnelMode with yaml
  47. func (s TunnelStatus) MarshalYAML() (any, error) {
  48. return s.String(), nil
  49. }
  50. func (s TunnelStatus) String() string {
  51. switch s {
  52. case Suspend:
  53. return "suspend"
  54. case Inner:
  55. return "inner"
  56. case Running:
  57. return "running"
  58. default:
  59. return "Unknown"
  60. }
  61. }
  62. type AtomicStatus struct {
  63. value atomic.Int32
  64. }
  65. func (a *AtomicStatus) Store(s TunnelStatus) {
  66. a.value.Store(int32(s))
  67. }
  68. func (a *AtomicStatus) Load() TunnelStatus {
  69. return TunnelStatus(a.value.Load())
  70. }
  71. func (a *AtomicStatus) String() string {
  72. return a.Load().String()
  73. }
  74. func newAtomicStatus(s TunnelStatus) *AtomicStatus {
  75. a := &AtomicStatus{}
  76. a.Store(s)
  77. return a
  78. }