mode.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package tunnel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "strings"
  6. )
  7. type TunnelMode int
  8. // ModeMapping is a mapping for Mode enum
  9. var ModeMapping = map[string]TunnelMode{
  10. Global.String(): Global,
  11. Rule.String(): Rule,
  12. Direct.String(): Direct,
  13. }
  14. const (
  15. Global TunnelMode = iota
  16. Rule
  17. Direct
  18. )
  19. // UnmarshalJSON unserialize Mode
  20. func (m *TunnelMode) UnmarshalJSON(data []byte) error {
  21. var tp string
  22. json.Unmarshal(data, &tp)
  23. mode, exist := ModeMapping[strings.ToLower(tp)]
  24. if !exist {
  25. return errors.New("invalid mode")
  26. }
  27. *m = mode
  28. return nil
  29. }
  30. // UnmarshalYAML unserialize Mode with yaml
  31. func (m *TunnelMode) UnmarshalYAML(unmarshal func(any) error) error {
  32. var tp string
  33. unmarshal(&tp)
  34. mode, exist := ModeMapping[strings.ToLower(tp)]
  35. if !exist {
  36. return errors.New("invalid mode")
  37. }
  38. *m = mode
  39. return nil
  40. }
  41. // MarshalJSON serialize Mode
  42. func (m TunnelMode) MarshalJSON() ([]byte, error) {
  43. return json.Marshal(m.String())
  44. }
  45. // MarshalYAML serialize TunnelMode with yaml
  46. func (m TunnelMode) MarshalYAML() (any, error) {
  47. return m.String(), nil
  48. }
  49. func (m TunnelMode) String() string {
  50. switch m {
  51. case Global:
  52. return "global"
  53. case Rule:
  54. return "rule"
  55. case Direct:
  56. return "direct"
  57. default:
  58. return "Unknown"
  59. }
  60. }