From 85bb40aaf8ca6260dd70aca7f2e7f8a44805122e Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Thu, 12 Jun 2025 01:23:34 +0800 Subject: [PATCH] chore: add Int32Enum for common/atomic --- common/atomic/enum.go | 50 ++++++++++++++++++ component/process/find_process_mode.go | 2 +- constant/dns.go | 73 -------------------------- constant/tun.go | 37 ------------- log/level.go | 35 ------------ tunnel/mode.go | 37 +------------ tunnel/status.go | 60 +-------------------- tunnel/tunnel.go | 4 +- 8 files changed, 55 insertions(+), 243 deletions(-) create mode 100644 common/atomic/enum.go diff --git a/common/atomic/enum.go b/common/atomic/enum.go new file mode 100644 index 00000000..9b73c6d8 --- /dev/null +++ b/common/atomic/enum.go @@ -0,0 +1,50 @@ +package atomic + +import ( + "encoding/json" + "fmt" + "sync/atomic" +) + +type Int32Enum[T ~int32] struct { + value atomic.Int32 +} + +func (i *Int32Enum[T]) MarshalJSON() ([]byte, error) { + return json.Marshal(i.Load()) +} + +func (i *Int32Enum[T]) UnmarshalJSON(b []byte) error { + var v T + if err := json.Unmarshal(b, &v); err != nil { + return err + } + i.Store(v) + return nil +} + +func (i *Int32Enum[T]) String() string { + return fmt.Sprint(i.Load()) +} + +func (i *Int32Enum[T]) Store(v T) { + i.value.Store(int32(v)) +} + +func (i *Int32Enum[T]) Load() T { + return T(i.value.Load()) +} + +func (i *Int32Enum[T]) Swap(new T) T { + return T(i.value.Swap(int32(new))) +} + +func (i *Int32Enum[T]) CompareAndSwap(old, new T) bool { + return i.value.CompareAndSwap(int32(old), int32(new)) +} + +func NewInt32Enum[T ~int32](v T) *Int32Enum[T] { + a := &Int32Enum[T]{} + a.Store(v) + return a +} diff --git a/component/process/find_process_mode.go b/component/process/find_process_mode.go index 8add9df8..5aa61e36 100644 --- a/component/process/find_process_mode.go +++ b/component/process/find_process_mode.go @@ -19,7 +19,7 @@ var ( } ) -type FindProcessMode int +type FindProcessMode int32 // UnmarshalText unserialize FindProcessMode func (m *FindProcessMode) UnmarshalText(data []byte) error { diff --git a/constant/dns.go b/constant/dns.go index b0874eef..13a2ed36 100644 --- a/constant/dns.go +++ b/constant/dns.go @@ -1,7 +1,6 @@ package constant import ( - "encoding/json" "errors" "strings" ) @@ -22,44 +21,6 @@ const ( type DNSMode int -// UnmarshalYAML unserialize EnhancedMode with yaml -func (e *DNSMode) UnmarshalYAML(unmarshal func(any) error) error { - var tp string - if err := unmarshal(&tp); err != nil { - return err - } - mode, exist := DNSModeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid mode") - } - *e = mode - return nil -} - -// MarshalYAML serialize EnhancedMode with yaml -func (e DNSMode) MarshalYAML() (any, error) { - return e.String(), nil -} - -// UnmarshalJSON unserialize EnhancedMode with json -func (e *DNSMode) UnmarshalJSON(data []byte) error { - var tp string - if err := json.Unmarshal(data, &tp); err != nil { - return err - } - mode, exist := DNSModeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid mode") - } - *e = mode - return nil -} - -// MarshalJSON serialize EnhancedMode with json -func (e DNSMode) MarshalJSON() ([]byte, error) { - return json.Marshal(e.String()) -} - // UnmarshalText unserialize EnhancedMode func (e *DNSMode) UnmarshalText(data []byte) error { mode, exist := DNSModeMapping[strings.ToLower(string(data))] @@ -157,40 +118,6 @@ func (e FilterMode) String() string { } } -func (e FilterMode) MarshalYAML() (interface{}, error) { - return e.String(), nil -} - -func (e *FilterMode) UnmarshalYAML(unmarshal func(interface{}) error) error { - var tp string - if err := unmarshal(&tp); err != nil { - return err - } - mode, exist := FilterModeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid mode") - } - *e = mode - return nil -} - -func (e FilterMode) MarshalJSON() ([]byte, error) { - return json.Marshal(e.String()) -} - -func (e *FilterMode) UnmarshalJSON(data []byte) error { - var tp string - if err := json.Unmarshal(data, &tp); err != nil { - return err - } - mode, exist := FilterModeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid mode") - } - *e = mode - return nil -} - func (e FilterMode) MarshalText() ([]byte, error) { return []byte(e.String()), nil } diff --git a/constant/tun.go b/constant/tun.go index 669f7a2e..5b4a6b22 100644 --- a/constant/tun.go +++ b/constant/tun.go @@ -1,7 +1,6 @@ package constant import ( - "encoding/json" "errors" "strings" ) @@ -20,42 +19,6 @@ const ( type TUNStack int -// UnmarshalYAML unserialize TUNStack with yaml -func (e *TUNStack) UnmarshalYAML(unmarshal func(any) error) error { - var tp string - if err := unmarshal(&tp); err != nil { - return err - } - mode, exist := StackTypeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid tun stack") - } - *e = mode - return nil -} - -// MarshalYAML serialize TUNStack with yaml -func (e TUNStack) MarshalYAML() (any, error) { - return e.String(), nil -} - -// UnmarshalJSON unserialize TUNStack with json -func (e *TUNStack) UnmarshalJSON(data []byte) error { - var tp string - json.Unmarshal(data, &tp) - mode, exist := StackTypeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid tun stack") - } - *e = mode - return nil -} - -// MarshalJSON serialize TUNStack with json -func (e TUNStack) MarshalJSON() ([]byte, error) { - return json.Marshal(e.String()) -} - // UnmarshalText unserialize TUNStack func (e *TUNStack) UnmarshalText(data []byte) error { mode, exist := StackTypeMapping[strings.ToLower(string(data))] diff --git a/log/level.go b/log/level.go index b1aa8f3f..175adb15 100644 --- a/log/level.go +++ b/log/level.go @@ -1,7 +1,6 @@ package log import ( - "encoding/json" "errors" "strings" ) @@ -25,30 +24,6 @@ const ( type LogLevel int -// UnmarshalYAML unserialize LogLevel with yaml -func (l *LogLevel) UnmarshalYAML(unmarshal func(any) error) error { - var tp string - unmarshal(&tp) - level, exist := LogLevelMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid log-level") - } - *l = level - return nil -} - -// UnmarshalJSON unserialize LogLevel with json -func (l *LogLevel) UnmarshalJSON(data []byte) error { - var tp string - json.Unmarshal(data, &tp) - level, exist := LogLevelMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid log-level") - } - *l = level - return nil -} - // UnmarshalText unserialize LogLevel func (l *LogLevel) UnmarshalText(data []byte) error { level, exist := LogLevelMapping[strings.ToLower(string(data))] @@ -59,16 +34,6 @@ func (l *LogLevel) UnmarshalText(data []byte) error { return nil } -// MarshalYAML serialize LogLevel with yaml -func (l LogLevel) MarshalYAML() (any, error) { - return l.String(), nil -} - -// MarshalJSON serialize LogLevel with json -func (l LogLevel) MarshalJSON() ([]byte, error) { - return json.Marshal(l.String()) -} - // MarshalText serialize LogLevel func (l LogLevel) MarshalText() ([]byte, error) { return []byte(l.String()), nil diff --git a/tunnel/mode.go b/tunnel/mode.go index dd89c3a7..018ae406 100644 --- a/tunnel/mode.go +++ b/tunnel/mode.go @@ -1,12 +1,11 @@ package tunnel import ( - "encoding/json" "errors" "strings" ) -type TunnelMode int +type TunnelMode int32 // ModeMapping is a mapping for Mode enum var ModeMapping = map[string]TunnelMode{ @@ -21,30 +20,6 @@ const ( Direct ) -// UnmarshalYAML unserialize Mode with yaml -func (m *TunnelMode) UnmarshalYAML(unmarshal func(any) error) error { - var tp string - unmarshal(&tp) - mode, exist := ModeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid mode") - } - *m = mode - return nil -} - -// UnmarshalJSON unserialize Mode -func (m *TunnelMode) UnmarshalJSON(data []byte) error { - var tp string - json.Unmarshal(data, &tp) - mode, exist := ModeMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid mode") - } - *m = mode - return nil -} - // UnmarshalText unserialize Mode func (m *TunnelMode) UnmarshalText(data []byte) error { mode, exist := ModeMapping[strings.ToLower(string(data))] @@ -55,16 +30,6 @@ func (m *TunnelMode) UnmarshalText(data []byte) error { return nil } -// MarshalYAML serialize TunnelMode with yaml -func (m TunnelMode) MarshalYAML() (any, error) { - return m.String(), nil -} - -// MarshalJSON serialize Mode -func (m TunnelMode) MarshalJSON() ([]byte, error) { - return json.Marshal(m.String()) -} - // MarshalText serialize Mode func (m TunnelMode) MarshalText() ([]byte, error) { return []byte(m.String()), nil diff --git a/tunnel/status.go b/tunnel/status.go index 388d597b..0a883113 100644 --- a/tunnel/status.go +++ b/tunnel/status.go @@ -1,13 +1,11 @@ package tunnel import ( - "encoding/json" "errors" "strings" - "sync/atomic" ) -type TunnelStatus int +type TunnelStatus int32 // StatusMapping is a mapping for Status enum var StatusMapping = map[string]TunnelStatus{ @@ -22,30 +20,6 @@ const ( Running ) -// UnmarshalYAML unserialize Status with yaml -func (s *TunnelStatus) UnmarshalYAML(unmarshal func(any) error) error { - var tp string - unmarshal(&tp) - status, exist := StatusMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid status") - } - *s = status - return nil -} - -// UnmarshalJSON unserialize Status -func (s *TunnelStatus) UnmarshalJSON(data []byte) error { - var tp string - json.Unmarshal(data, &tp) - status, exist := StatusMapping[strings.ToLower(tp)] - if !exist { - return errors.New("invalid status") - } - *s = status - return nil -} - // UnmarshalText unserialize Status func (s *TunnelStatus) UnmarshalText(data []byte) error { status, exist := StatusMapping[strings.ToLower(string(data))] @@ -56,16 +30,6 @@ func (s *TunnelStatus) UnmarshalText(data []byte) error { return nil } -// MarshalYAML serialize TunnelMode with yaml -func (s TunnelStatus) MarshalYAML() (any, error) { - return s.String(), nil -} - -// MarshalJSON serialize Status -func (s TunnelStatus) MarshalJSON() ([]byte, error) { - return json.Marshal(s.String()) -} - // MarshalText serialize Status func (s TunnelStatus) MarshalText() ([]byte, error) { return []byte(s.String()), nil @@ -83,25 +47,3 @@ func (s TunnelStatus) String() string { return "Unknown" } } - -type AtomicStatus struct { - value atomic.Int32 -} - -func (a *AtomicStatus) Store(s TunnelStatus) { - a.value.Store(int32(s)) -} - -func (a *AtomicStatus) Load() TunnelStatus { - return TunnelStatus(a.value.Load()) -} - -func (a *AtomicStatus) String() string { - return a.Load().String() -} - -func newAtomicStatus(s TunnelStatus) *AtomicStatus { - a := &AtomicStatus{} - a.Store(s) - return a -} diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index f6d87670..17d1f282 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -35,7 +35,7 @@ const ( ) var ( - status = newAtomicStatus(Suspend) + status = atomic.NewInt32Enum(Suspend) udpInit sync.Once udpQueues []chan C.PacketAdapter natTable = nat.New() @@ -59,7 +59,7 @@ var ( // default timeout for UDP session udpTimeout = 60 * time.Second - findProcessMode = atomic.NewTypedValue(P.FindProcessStrict) + findProcessMode = atomic.NewInt32Enum(P.FindProcessStrict) fakeIPRange netip.Prefix