mirror of
https://github.com/bestnite/sub2clash.git
synced 2025-06-17 12:43:18 +08:00
refactor
This commit is contained in:
77
parser/registry.go
Normal file
77
parser/registry.go
Normal file
@ -0,0 +1,77 @@
|
||||
package parser
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
E "github.com/bestnite/sub2clash/error"
|
||||
P "github.com/bestnite/sub2clash/model/proxy"
|
||||
)
|
||||
|
||||
// ProxyParser 定义代理解析器接口
|
||||
type ProxyParser interface {
|
||||
// Parse 解析代理字符串并返回Proxy对象
|
||||
Parse(proxy string) (P.Proxy, error)
|
||||
// GetPrefix 返回支持的协议前缀(可以返回多个)
|
||||
GetPrefixes() []string
|
||||
// GetType 返回协议类型名称
|
||||
GetType() string
|
||||
}
|
||||
|
||||
// parserRegistry 解析器注册中心
|
||||
type parserRegistry struct {
|
||||
mu sync.RWMutex
|
||||
parsers map[string]ProxyParser // prefix -> parser
|
||||
}
|
||||
|
||||
var registry = &parserRegistry{
|
||||
parsers: make(map[string]ProxyParser),
|
||||
}
|
||||
|
||||
// RegisterParser 注册解析器
|
||||
func RegisterParser(parser ProxyParser) {
|
||||
registry.mu.Lock()
|
||||
defer registry.mu.Unlock()
|
||||
|
||||
for _, prefix := range parser.GetPrefixes() {
|
||||
registry.parsers[prefix] = parser
|
||||
}
|
||||
}
|
||||
|
||||
// GetParser 根据前缀获取解析器
|
||||
func GetParser(prefix string) (ProxyParser, bool) {
|
||||
registry.mu.RLock()
|
||||
defer registry.mu.RUnlock()
|
||||
|
||||
parser, exists := registry.parsers[prefix]
|
||||
return parser, exists
|
||||
}
|
||||
|
||||
// GetAllParsers 获取所有注册的解析器
|
||||
func GetAllParsers() map[string]ProxyParser {
|
||||
registry.mu.RLock()
|
||||
defer registry.mu.RUnlock()
|
||||
|
||||
result := make(map[string]ProxyParser)
|
||||
for k, v := range registry.parsers {
|
||||
result[k] = v
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// ParseProxyWithRegistry 使用注册机制解析代理
|
||||
func ParseProxyWithRegistry(proxy string) (P.Proxy, error) {
|
||||
proxy = strings.TrimSpace(proxy)
|
||||
if proxy == "" {
|
||||
return P.Proxy{}, &E.ParseError{Type: E.ErrInvalidStruct, Raw: proxy, Message: "empty proxy string"}
|
||||
}
|
||||
|
||||
// 查找匹配的解析器
|
||||
for prefix, parser := range registry.parsers {
|
||||
if strings.HasPrefix(proxy, prefix) {
|
||||
return parser.Parse(proxy)
|
||||
}
|
||||
}
|
||||
|
||||
return P.Proxy{}, &E.ParseError{Type: E.ErrInvalidPrefix, Raw: proxy, Message: "unsupported protocol"}
|
||||
}
|
Reference in New Issue
Block a user