46 lines
1.2 KiB
C#
46 lines
1.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace StellaOps.Signals.Parsing;
|
|
|
|
/// <summary>
|
|
/// Resolves callgraph parsers for specific languages.
|
|
/// </summary>
|
|
public interface ICallgraphParserResolver
|
|
{
|
|
/// <summary>
|
|
/// Resolves a parser for the supplied language.
|
|
/// </summary>
|
|
ICallgraphParser Resolve(string language);
|
|
}
|
|
|
|
internal sealed class CallgraphParserResolver : ICallgraphParserResolver
|
|
{
|
|
private readonly IReadOnlyDictionary<string, ICallgraphParser> parsersByLanguage;
|
|
|
|
public CallgraphParserResolver(IEnumerable<ICallgraphParser> parsers)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(parsers);
|
|
|
|
var map = new Dictionary<string, ICallgraphParser>(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);
|
|
}
|
|
}
|