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