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