using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using StellaOps.Concelier.Core; using StellaOps.Concelier.Merge.Jobs; using StellaOps.Concelier.Merge.Options; using StellaOps.Concelier.Merge.Services; namespace StellaOps.Concelier.Merge; public static class MergeServiceCollectionExtensions { public static IServiceCollection AddMergeModule(this IServiceCollection services, IConfiguration configuration) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configuration); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(sp => { var options = configuration.GetSection("concelier:merge:precedence").Get(); return options is null ? new AffectedPackagePrecedenceResolver() : new AffectedPackagePrecedenceResolver(options); }); services.TryAddSingleton(sp => { var resolver = sp.GetRequiredService(); var options = configuration.GetSection("concelier:merge:precedence").Get(); var timeProvider = sp.GetRequiredService(); var logger = sp.GetRequiredService>(); return new AdvisoryPrecedenceMerger(resolver, options, timeProvider, logger); }); services.TryAddSingleton(); services.TryAddSingleton(); services.AddTransient(); return services; } }