tun.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package constant
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "strings"
  6. )
  7. var StackTypeMapping = map[string]TUNStack{
  8. strings.ToLower(TunGvisor.String()): TunGvisor,
  9. strings.ToLower(TunSystem.String()): TunSystem,
  10. strings.ToLower(TunMixed.String()): TunMixed,
  11. }
  12. const (
  13. TunGvisor TUNStack = iota
  14. TunSystem
  15. TunMixed
  16. )
  17. type TUNStack int
  18. // UnmarshalYAML unserialize TUNStack with yaml
  19. func (e *TUNStack) UnmarshalYAML(unmarshal func(any) error) error {
  20. var tp string
  21. if err := unmarshal(&tp); err != nil {
  22. return err
  23. }
  24. mode, exist := StackTypeMapping[strings.ToLower(tp)]
  25. if !exist {
  26. return errors.New("invalid tun stack")
  27. }
  28. *e = mode
  29. return nil
  30. }
  31. // MarshalYAML serialize TUNStack with yaml
  32. func (e TUNStack) MarshalYAML() (any, error) {
  33. return e.String(), nil
  34. }
  35. // UnmarshalJSON unserialize TUNStack with json
  36. func (e *TUNStack) UnmarshalJSON(data []byte) error {
  37. var tp string
  38. json.Unmarshal(data, &tp)
  39. mode, exist := StackTypeMapping[strings.ToLower(tp)]
  40. if !exist {
  41. return errors.New("invalid tun stack")
  42. }
  43. *e = mode
  44. return nil
  45. }
  46. // MarshalJSON serialize TUNStack with json
  47. func (e TUNStack) MarshalJSON() ([]byte, error) {
  48. return json.Marshal(e.String())
  49. }
  50. func (e TUNStack) String() string {
  51. switch e {
  52. case TunGvisor:
  53. return "gVisor"
  54. case TunSystem:
  55. return "System"
  56. case TunMixed:
  57. return "Mixed"
  58. default:
  59. return "unknown"
  60. }
  61. }