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