// 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;
}
}