using System; using System.Collections.Generic; using System.Linq; using zero.Core.Routing; namespace zero.Core.Options { public class RoutingEndpointOptions { HashSet Resolvers { get; set; } = new(); class ResolverMap { public Type Type { get; set; } public Func Impl { get; set; } } public void Add(Func resolver) where T : class, IResolvedRoute { Resolvers.Add(new() { Type = typeof(T), Impl = obj => resolver(obj as T) }); } public void Replace(Func resolver) where T : class, IResolvedRoute { Remove(); Add(resolver); } public void Remove() where T : IResolvedRoute { Type type = typeof(T); Resolvers.RemoveWhere(x => x.Type == type); } public Func Get() where T : IResolvedRoute => Get(typeof(T)); public IEnumerable> GetAll() where T : IResolvedRoute => GetAll(typeof(T)); public Func Get(Type type) { ResolverMap map = Resolvers.LastOrDefault(x => x.Type == type); return map?.Impl; } public IEnumerable> GetAll(Type type) { IEnumerable maps = Resolvers.Where(x => x.Type == type); return maps.Select(map => map.Impl).Where(x => x != null); } } }