Files

58 lines
1.3 KiB
Go

package proxy
import (
"fmt"
"strings"
"gopkg.in/yaml.v3"
)
func IsMihomoOnlyProtocol(proxyConfig string) bool {
return mihomoOnlyProtocolType(proxyConfig) != ""
}
func mihomoOnlyProtocolType(proxyConfig string) string {
nodeType := clashNodeType(proxyConfig)
switch nodeType {
case "mieru":
return nodeType
default:
return ""
}
}
func validateMihomoOnlyProtocol(proxyConfig string) error {
src := strings.TrimSpace(proxyConfig)
var payload interface{}
if err := yaml.Unmarshal([]byte(src), &payload); err != nil {
return fmt.Errorf("YAML 解析失败: %w", err)
}
node := pickClashNode(payload)
if node == nil {
return fmt.Errorf("mihomo 节点解析失败")
}
if getMapString(node, "server") == "" {
return fmt.Errorf("mieru 节点缺少 server")
}
if getMapInt(node, "port") == 0 {
return fmt.Errorf("mieru 节点缺少 port")
}
return nil
}
func clashNodeType(proxyConfig string) string {
src := strings.TrimSpace(proxyConfig)
if src == "" || (!strings.Contains(strings.ToLower(src), "type:") && !strings.Contains(strings.ToLower(src), "proxies:")) {
return ""
}
var payload interface{}
if err := yaml.Unmarshal([]byte(src), &payload); err != nil {
return ""
}
node := pickClashNode(payload)
if node == nil {
return ""
}
return strings.ToLower(strings.TrimSpace(getMapString(node, "type")))
}