package linknorm import ( "fmt" "strings" "vpnclient/internal/config" "vpnclient/internal/protocols/awg" "vpnclient/internal/protocols/hysteria2" "vpnclient/internal/protocols/naive" "vpnclient/internal/protocols/xray" ) // Normalize normalizes a share/proxy URI for the given protocol (or auto-detect). func Normalize(proto config.Protocol, raw string) (normalized string, detected config.Protocol, remark string, err error) { raw = strings.TrimSpace(raw) if raw == "" { return "", proto, "", fmt.Errorf("пустая ссылка") } if proto == "" { proto = config.DetectProtocol(raw) } switch proto { case config.ProtocolHysteria2: u, rem, err := hysteria2.NormalizeShareLink(raw) return u, config.ProtocolHysteria2, rem, err case config.ProtocolAWG: u, rem, err := awg.NormalizeShareLink(raw) return u, config.ProtocolAWG, rem, err case config.ProtocolVLESS, config.ProtocolVMess, config.ProtocolTrojan: u, rem, err := xray.NormalizeShareLink(raw) if err != nil { return "", proto, "", err } detected = xray.DetectProtocol(u) if detected == "" { detected = proto } return u, detected, rem, nil case config.ProtocolNaive, "": if awg.Detect(raw) { u, rem, err := awg.NormalizeShareLink(raw) return u, config.ProtocolAWG, rem, err } if xray.Detect(raw) { u, rem, err := xray.NormalizeShareLink(raw) return u, xray.DetectProtocol(raw), rem, err } u, rem, err := naive.ParseShareLink(raw) if err != nil { if hysteria2.Detect(raw) { u2, rem2, err2 := hysteria2.NormalizeShareLink(raw) return u2, config.ProtocolHysteria2, rem2, err2 } return "", config.ProtocolNaive, "", err } return u, config.ProtocolNaive, rem, nil default: return "", proto, "", fmt.Errorf("unsupported protocol %q", proto) } }