using System; using System.Collections.Generic; namespace StellaOps.Signals.Parsing; /// /// Resolves callgraph parsers for specific languages. /// public interface ICallgraphParserResolver { /// /// Resolves a parser for the supplied language. /// ICallgraphParser Resolve(string language); } internal sealed class CallgraphParserResolver : ICallgraphParserResolver { private readonly IReadOnlyDictionary parsersByLanguage; public CallgraphParserResolver(IEnumerable parsers) { ArgumentNullException.ThrowIfNull(parsers); var map = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var parser in parsers) { map[parser.Language] = parser; } parsersByLanguage = map; } public ICallgraphParser Resolve(string language) { ArgumentException.ThrowIfNullOrWhiteSpace(language); if (parsersByLanguage.TryGetValue(language, out var parser)) { return parser; } throw new CallgraphParserNotFoundException(language); } }