// Licensed under AGPL-3.0-or-later. Copyright (C) 2026 StellaOps Contributors. // Sprint: SPRINT_20260110_012_008_POLICY // Task: FCG-003 - Policy Engine Integration using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using StellaOps.Policy.Gates; namespace StellaOps.Policy.Predicates.FixChain; /// /// Extension methods for registering FixChain gate services. /// public static class FixChainGateExtensions { /// /// Adds FixChain gate predicate services to the service collection. /// /// Service collection. /// Configuration section for options. /// Service collection for chaining. public static IServiceCollection AddFixChainGate( this IServiceCollection services, IConfiguration? configuration = null) { ArgumentNullException.ThrowIfNull(services); // Register options if (configuration is not null) { services.AddOptions() .Bind(configuration.GetSection("Policy:Predicates:FixChainGate")) .ValidateDataAnnotations() .ValidateOnStart(); } else { services.TryAddSingleton(new FixChainGateOptions()); } // Register core services services.TryAddSingleton(); services.TryAddSingleton(); // Register adapter for policy gate registry services.TryAddSingleton(); return services; } /// /// Adds FixChain gate predicate services with custom options. /// /// Service collection. /// Options configuration delegate. /// Service collection for chaining. public static IServiceCollection AddFixChainGate( this IServiceCollection services, Action configureOptions) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configureOptions); services.Configure(configureOptions); // Register core services services.TryAddSingleton(); services.TryAddSingleton(); // Register adapter for policy gate registry services.TryAddSingleton(); return services; } /// /// Registers the FixChain gate with the policy gate registry. /// /// Policy gate registry. /// Registry for chaining. public static IPolicyGateRegistry RegisterFixChainGate(this IPolicyGateRegistry registry) { ArgumentNullException.ThrowIfNull(registry); registry.Register("fixChainRequired"); return registry; } }