using DigitalData.Core.Abstractions.Security; using System.Collections; namespace DigitalData.Core.Security.Cryptographer { public class RSACryptographerList : IEnumerable where TRSACryptographer : IRSACryptographer { private readonly Func _keyGenerator; private readonly IEnumerable _cryptographers; internal RSACryptographerList(Func keyGenerator, IEnumerable cryptographers) { _keyGenerator = keyGenerator; _cryptographers = cryptographers; } public TRSACryptographer this[string key] => _cryptographers.SingleOrDefault(crypt => _keyGenerator(crypt) == key) ?? throw new InvalidOperationException($"No {typeof(TRSACryptographer).GetType().Name.TrimStart('I')} found with Key: {key}."); public bool TryGet(string key, out TRSACryptographer? cryptographer) { cryptographer = _cryptographers.SingleOrDefault(crypt => _keyGenerator(crypt) == key); return cryptographer is not null; } public IEnumerator GetEnumerator() => _cryptographers.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } }