package config import "strings" // DetectProtocol infers protocol from a share/proxy URI or config body. func DetectProtocol(raw string) Protocol { lower := strings.ToLower(strings.TrimSpace(raw)) switch { case strings.HasPrefix(lower, "hysteria2://"), strings.HasPrefix(lower, "hy2://"): return ProtocolHysteria2 case strings.HasPrefix(lower, "vless://"): return ProtocolVLESS case strings.HasPrefix(lower, "vmess://"): return ProtocolVMess case strings.HasPrefix(lower, "trojan://"): return ProtocolTrojan case strings.HasPrefix(lower, "awg://"), strings.HasPrefix(lower, "amneziawg://"), strings.HasPrefix(lower, "wireguard://"), strings.HasPrefix(lower, "vpn://"): return ProtocolAWG case strings.Contains(lower, "[interface]") && (strings.Contains(lower, "privatekey") || strings.Contains(lower, "private_key") || strings.Contains(lower, "private key")): return ProtocolAWG case strings.HasPrefix(strings.TrimSpace(raw), "{") && (strings.Contains(lower, "client_priv_key") || strings.Contains(lower, "server_pub_key")): return ProtocolAWG case strings.HasPrefix(lower, "naive+"), strings.HasPrefix(lower, "naive://"), strings.HasPrefix(lower, "https://"), strings.HasPrefix(lower, "quic://"), strings.HasPrefix(lower, "http://"): return ProtocolNaive default: return "" } }