using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using zero.Core.Database; using zero.Core.Entities; namespace zero.Core.Routing { public class Links : ILinks { protected IZeroStore Store { get; set; } protected ILogger Logger { get; set; } protected IEnumerable Providers { get; set; } public Links(IZeroStore store, ILogger logger, IEnumerable providers) { Store = store; Logger = logger; Providers = providers; } /// public T GetProvider() where T : class, ILinkProvider { Type type = typeof(T); return Providers.FirstOrDefault(x => x.GetType().IsAssignableFrom(type)) as T; } /// public async Task GetUrl(Link link) { ILinkProvider provider = Providers.LastOrDefault(x => x.CanProcess(link)); if (provider == null) { Logger.LogWarning("Could not find provider for link with area {area}", link.Area); return null; } return await provider.Resolve(link); } /// public async Task> GetUrls(params Link[] links) { Dictionary result = new(); foreach (Link link in links) { result.Add(link, await GetUrl(link)); } return result; } /// public ILinkProvider GetProvider(Link link) { return Providers.LastOrDefault(x => x.CanProcess(link)); } } public interface ILinks { /// /// Get URL from a link object by finding a provider which can resolve the link /// Task GetUrl(Link link); /// /// Get URLs from link objects by finding matching providers /// Task> GetUrls(params Link[] links); /// /// Get the provider for a specific link /// ILinkProvider GetProvider(Link link); /// /// Find a provider by a specific type /// T GetProvider() where T : class, ILinkProvider; } }