namespace Deal.Modules.Cards.Application.Sources;
///
/// Выбирает провайдера содержимого по виду источника.
///
public sealed class SourceContentResolver
{
private readonly Dictionary _providers;
///
/// Создаёт реестр провайдеров содержимого.
///
/// Зарегистрированные провайдеры; последний по виду перекрывает предыдущих.
public SourceContentResolver(IEnumerable providers)
{
_providers = new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (ISourceContentProvider provider in providers)
{
_providers[provider.Kind] = provider;
}
}
///
/// Есть ли провайдер для вида источника.
///
/// Ссылка на источник.
/// true — содержимое можно загрузить лениво.
public bool CanResolve(SourceRef source) => _providers.ContainsKey(source.Kind);
///
/// Загружает содержимое записи источника.
///
/// Ссылка на источник.
/// Токен отмены.
/// Содержимое записи либо null — провайдера нет/источник не отдал данные.
public Task ResolveAsync(SourceRef source, CancellationToken ct)
{
return _providers.TryGetValue(source.Kind, out ISourceContentProvider? provider)
? provider.LoadAsync(source, ct)
: Task.FromResult(null);
}
}