// Licensed under AGPL-3.0-or-later. Copyright (C) 2026 StellaOps Contributors. using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace StellaOps.BinaryIndex.Analysis; /// /// Extension methods for registering analysis services. /// public static class ServiceCollectionExtensions { /// /// Adds golden set analysis pipeline services. /// /// Service collection. /// Configuration for options binding. /// Service collection for chaining. public static IServiceCollection AddGoldenSetAnalysis( this IServiceCollection services, IConfiguration? configuration = null) { // Register options if (configuration is not null) { services.Configure( configuration.GetSection("BinaryIndex:Analysis:Fingerprinting")); services.Configure( configuration.GetSection("BinaryIndex:Analysis:Matching")); services.Configure( configuration.GetSection("BinaryIndex:Analysis:Reachability")); services.Configure( configuration.GetSection("BinaryIndex:Analysis")); } else { // Register default options services.Configure(_ => { }); services.Configure(_ => { }); services.Configure(_ => { }); services.Configure(_ => { }); } // Register core services services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); // Register stub implementations (to be replaced with real implementations) services.AddSingleton(); services.AddSingleton(); // Register null reachability service (for testing/standalone use) // Real implementation should be registered via AddReachGraphIntegration services.TryAddSingleton(); // Register pipeline services.AddSingleton(); return services; } /// /// Registers a custom IBinaryReachabilityService implementation. /// Use this to provide real ReachGraph integration. /// /// Implementation type. /// Service collection. /// Service collection for chaining. public static IServiceCollection AddBinaryReachabilityService( this IServiceCollection services) where TImplementation : class, IBinaryReachabilityService { // Remove any existing registration var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(IBinaryReachabilityService)); if (descriptor is not null) { services.Remove(descriptor); } services.AddSingleton(); return services; } /// /// Registers a custom IBinaryReachabilityService instance. /// Use this to provide real ReachGraph integration via factory. /// /// Service collection. /// Factory to create the service. /// Service collection for chaining. public static IServiceCollection AddBinaryReachabilityService( this IServiceCollection services, Func factory) { // Remove any existing registration var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(IBinaryReachabilityService)); if (descriptor is not null) { services.Remove(descriptor); } services.AddSingleton(factory); return services; } }