using StellaOps.Policy.Registry.Contracts; using StellaOps.Policy.Registry.Storage; namespace StellaOps.Policy.Registry.Services; /// /// Service for compiling and validating policy packs. /// Implements REGISTRY-API-27-003: Compile endpoint integration. /// public interface IPolicyPackCompiler { /// /// Compiles a policy pack, validating all rules and computing a digest. /// Task CompileAsync( Guid tenantId, Guid packId, CancellationToken cancellationToken = default); /// /// Validates a single Rego rule without persisting. /// Task ValidateRuleAsync( string ruleId, string? rego, CancellationToken cancellationToken = default); /// /// Validates all rules in a policy pack without persisting. /// Task ValidatePackAsync( CreatePolicyPackRequest request, CancellationToken cancellationToken = default); } /// /// Result of policy pack compilation. /// public sealed record PolicyPackCompilationResult { public required bool Success { get; init; } public string? Digest { get; init; } public IReadOnlyList? Errors { get; init; } public IReadOnlyList? Warnings { get; init; } public PolicyPackCompilationStatistics? Statistics { get; init; } public long DurationMilliseconds { get; init; } public static PolicyPackCompilationResult FromSuccess( string digest, PolicyPackCompilationStatistics statistics, IReadOnlyList? warnings, long durationMs) => new() { Success = true, Digest = digest, Statistics = statistics, Warnings = warnings, DurationMilliseconds = durationMs }; public static PolicyPackCompilationResult FromFailure( IReadOnlyList errors, IReadOnlyList? warnings, long durationMs) => new() { Success = false, Errors = errors, Warnings = warnings, DurationMilliseconds = durationMs }; } /// /// Result of single rule validation. /// public sealed record RuleValidationResult { public required bool Success { get; init; } public string? RuleId { get; init; } public IReadOnlyList? Errors { get; init; } public IReadOnlyList? Warnings { get; init; } public static RuleValidationResult FromSuccess( string ruleId, IReadOnlyList? warnings = null) => new() { Success = true, RuleId = ruleId, Warnings = warnings }; public static RuleValidationResult FromFailure( string ruleId, IReadOnlyList errors, IReadOnlyList? warnings = null) => new() { Success = false, RuleId = ruleId, Errors = errors, Warnings = warnings }; } /// /// Statistics from policy pack compilation. /// public sealed record PolicyPackCompilationStatistics { public required int TotalRules { get; init; } public required int EnabledRules { get; init; } public required int DisabledRules { get; init; } public required int RulesWithRego { get; init; } public required int RulesWithoutRego { get; init; } public required IReadOnlyDictionary SeverityCounts { get; init; } }