using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace StellaOps.Scanner.Surface.Secrets.Providers; internal sealed class CompositeSurfaceSecretProvider : ISurfaceSecretProvider { private readonly IReadOnlyList _providers; public CompositeSurfaceSecretProvider(IEnumerable providers) { _providers = providers?.ToArray() ?? throw new ArgumentNullException(nameof(providers)); if (_providers.Count == 0) { throw new ArgumentException("At least one provider must be supplied.", nameof(providers)); } } public async ValueTask GetAsync( SurfaceSecretRequest request, CancellationToken cancellationToken = default) { foreach (var provider in _providers) { try { return await provider.GetAsync(request, cancellationToken).ConfigureAwait(false); } catch (SurfaceSecretNotFoundException) { // try next provider } } throw new SurfaceSecretNotFoundException(request); } }