using Proxd_man.Config.Outbound; namespace Proxd_man.ShareLink; public class ShareLinkParser { private static readonly Lazy> parser = new(() => [ new ShadowSocksLinkParserV2() ]); public static BaseOutboundSetting Parse(string shareLink) { foreach (var p in parser.Value.Where(p => p.CanParse(shareLink))) { return p.Parse(shareLink); } throw new InvalidShareLinkException("不支持的分享链接: " + shareLink); } } public interface IShareLinkParser { /// /// 检查该分享链接是否可以被该实现解析. /// /// 该方法只需要检查是否可以解析, 并不需要检查是否正确. /// /// 要尝试解析的出站配置分享链接. /// 如果可以被实现解析, 则返回 true. bool CanParse(string shareLink); /// /// 将分享链接解析为出站配置. /// /// 要解析的分享链接. /// 返回分享链接解析得出的出站配置. /// 当分享链接错误导致无法解析时抛出异常. BaseOutboundSetting Parse(string shareLink); } public class InvalidShareLinkException(string message, Exception? cause = null) : Exception(message, cause);