namespace DigitalData.Core.Abstractions.Security { public static class SecurityExtensions { public static IEnumerable GetByIssuer(this IEnumerable contextes, string issuer) where TUniqueSecurityContext: IUniqueSecurityContext => contextes.Where(c => c.Issuer == issuer); public static IEnumerable GetByAudience(this IEnumerable contextes, string audience) where TUniqueSecurityContext : IUniqueSecurityContext => contextes.Where(c => c.Audience == audience); public static TUniqueSecurityContext Get(this IEnumerable contextes, string issuer, string audience) where TUniqueSecurityContext : IUniqueSecurityContext => contextes.Where(c => c.Issuer == issuer && c.Audience == audience).SingleOrDefault() ?? throw new InvalidOperationException($"Exactly one {typeof(TUniqueSecurityContext).Name} must exist with Issuer: '{issuer}' and Audience: '{audience}'."); public static bool TryGet(this IEnumerable contextes, string issuer, string audience, out TUniqueSecurityContext? context) where TUniqueSecurityContext : IUniqueSecurityContext { context = contextes.SingleOrDefault(c => c.Issuer == issuer && c.Audience == audience); return context is not null; } } }