using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using StellaOps.Cryptography; namespace StellaOps.Cryptography.DependencyInjection; /// /// Dependency injection helpers for registering StellaOps cryptography services. /// public static class CryptoServiceCollectionExtensions { /// /// Registers the default crypto provider and registry. /// /// Service collection. /// Optional registry ordering configuration. /// Optional provider-level configuration (e.g. key registration). /// The service collection. public static IServiceCollection AddStellaOpsCrypto( this IServiceCollection services, Action? configureRegistry = null, Action? configureProvider = null) { ArgumentNullException.ThrowIfNull(services); if (configureRegistry is not null) { services.Configure(configureRegistry); } services.TryAddSingleton(sp => { var provider = new DefaultCryptoProvider(); configureProvider?.Invoke(provider); return provider; }); services.TryAddEnumerable(ServiceDescriptor.Singleton()); #if STELLAOPS_CRYPTO_SODIUM services.TryAddSingleton(); services.TryAddEnumerable(ServiceDescriptor.Singleton()); #endif services.TryAddSingleton(sp => { var providers = sp.GetServices(); var options = sp.GetService>(); IEnumerable? preferred = options?.Value?.PreferredProviders; return new CryptoProviderRegistry(providers, preferred); }); return services; } }