mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-02-26 16:57:08 +00:00
89 lines
2.5 KiB
Go
89 lines
2.5 KiB
Go
package provider
|
|
|
|
import (
|
|
"encoding"
|
|
"fmt"
|
|
|
|
"github.com/dlclark/regexp2"
|
|
)
|
|
|
|
type overrideSchema struct {
|
|
TFO *bool `provider:"tfo,omitempty"`
|
|
MPTcp *bool `provider:"mptcp,omitempty"`
|
|
UDP *bool `provider:"udp,omitempty"`
|
|
UDPOverTCP *bool `provider:"udp-over-tcp,omitempty"`
|
|
Up *string `provider:"up,omitempty"`
|
|
Down *string `provider:"down,omitempty"`
|
|
DialerProxy *string `provider:"dialer-proxy,omitempty"`
|
|
SkipCertVerify *bool `provider:"skip-cert-verify,omitempty"`
|
|
Interface *string `provider:"interface-name,omitempty"`
|
|
RoutingMark *int `provider:"routing-mark,omitempty"`
|
|
IPVersion *string `provider:"ip-version,omitempty"`
|
|
|
|
AdditionalPrefix *string `provider:"additional-prefix,omitempty"`
|
|
AdditionalSuffix *string `provider:"additional-suffix,omitempty"`
|
|
ProxyName []overrideProxyNameSchema `provider:"proxy-name,omitempty"`
|
|
}
|
|
|
|
type overrideProxyNameSchema struct {
|
|
// matching expression for regex replacement
|
|
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
|
|
|
|
func (o *overrideSchema) Apply(mapping map[string]any) error {
|
|
if o.TFO != nil {
|
|
mapping["tfo"] = *o.TFO
|
|
}
|
|
if o.MPTcp != nil {
|
|
mapping["mptcp"] = *o.MPTcp
|
|
}
|
|
if o.UDP != nil {
|
|
mapping["udp"] = *o.UDP
|
|
}
|
|
if o.UDPOverTCP != nil {
|
|
mapping["udp-over-tcp"] = *o.UDPOverTCP
|
|
}
|
|
if o.Up != nil {
|
|
mapping["up"] = *o.Up
|
|
}
|
|
if o.Down != nil {
|
|
mapping["down"] = *o.Down
|
|
}
|
|
if o.DialerProxy != nil {
|
|
mapping["dialer-proxy"] = *o.DialerProxy
|
|
}
|
|
if o.SkipCertVerify != nil {
|
|
mapping["skip-cert-verify"] = *o.SkipCertVerify
|
|
}
|
|
if o.Interface != nil {
|
|
mapping["interface-name"] = *o.Interface
|
|
}
|
|
if o.RoutingMark != nil {
|
|
mapping["routing-mark"] = *o.RoutingMark
|
|
}
|
|
if o.IPVersion != nil {
|
|
mapping["ip-version"] = *o.IPVersion
|
|
}
|
|
|
|
for _, expr := range o.ProxyName {
|
|
name := mapping["name"].(string)
|
|
newName, err := expr.Pattern.Replace(name, expr.Target, 0, -1)
|
|
if err != nil {
|
|
return fmt.Errorf("proxy name replace error: %w", err)
|
|
}
|
|
mapping["name"] = newName
|
|
}
|
|
if o.AdditionalPrefix != nil {
|
|
mapping["name"] = fmt.Sprintf("%s%s", *o.AdditionalPrefix, mapping["name"])
|
|
}
|
|
if o.AdditionalSuffix != nil {
|
|
mapping["name"] = fmt.Sprintf("%s%s", mapping["name"], *o.AdditionalSuffix)
|
|
}
|
|
|
|
return nil
|
|
}
|