diff --git a/adapter/provider/parser.go b/adapter/provider/parser.go index 4e168f7a5..078e8695c 100644 --- a/adapter/provider/parser.go +++ b/adapter/provider/parser.go @@ -1,6 +1,7 @@ package provider import ( + "encoding" "errors" "fmt" "time" @@ -10,6 +11,8 @@ import ( "github.com/metacubex/mihomo/component/resource" C "github.com/metacubex/mihomo/constant" types "github.com/metacubex/mihomo/constant/provider" + + "github.com/dlclark/regexp2" ) var ( @@ -28,11 +31,13 @@ type healthCheckSchema struct { type OverrideProxyNameSchema struct { // matching expression for regex replacement - Pattern string `provider:"pattern"` + Pattern *regexp2.Regexp `provider:"pattern"` // the new content after regex matching Target string `provider:"target"` } +var _ encoding.TextUnmarshaler = (*regexp2.Regexp)(nil) // ensure *regexp2.Regexp can decode direct by structure package + type OverrideSchema struct { TFO *bool `provider:"tfo,omitempty"` MPTcp *bool `provider:"mptcp,omitempty"` diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 789d66546..3103b5082 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -404,18 +404,10 @@ func proxiesParseAndFilter(filter string, excludeFilter string, excludeTypeArray name := mapping["name"].(string) mapping["name"] = name + *field.Interface().(*string) case "proxy-name": - exprList, ok := field.Interface().([]OverrideProxyNameSchema) - if !ok { - return nil, fmt.Errorf("can't parse proxy-provider override proxy-name, please see the docs example config") - } // Iterate through all naming replacement rules and perform the replacements. - for _, expr := range exprList { + for _, expr := range override.ProxyName { name := mapping["name"].(string) - nameReg, err := regexp2.Compile(expr.Pattern, regexp2.None) - if err != nil { - return nil, fmt.Errorf("parse proxy name regular expression %q error: %w", expr.Pattern, err) - } - newName, err := nameReg.Replace(name, expr.Target, 0, -1) + newName, err := expr.Pattern.Replace(name, expr.Target, 0, -1) if err != nil { return nil, fmt.Errorf("proxy name replace error: %w", err) }