/**
* Policy - Policy Model for Resolver
* Sprint: SPRINT_9100_0001_0001 (Core Resolver Package)
* Task: RESOLVER-9100-005
*
* Represents the policy used for verdict evaluation.
* Policy digest is included in FinalDigest for reproducibility.
*/
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
namespace StellaOps.Resolver;
///
/// Policy configuration for deterministic resolution.
///
/// Policy version string.
/// Policy rules as JSON.
/// SHA256 digest of policy constants.
public sealed record Policy(
string Version,
JsonElement Rules,
string ConstantsDigest)
{
private string? _digest;
///
/// SHA256 digest of the policy (version + rules + constants).
///
public string Digest => _digest ??= ComputeDigest();
private string ComputeDigest()
{
var input = $"{Version}:{Rules.GetRawText()}:{ConstantsDigest}";
var hash = SHA256.HashData(Encoding.UTF8.GetBytes(input));
return Convert.ToHexString(hash).ToLowerInvariant();
}
///
/// Creates a policy from version and rules JSON.
///
public static Policy Create(string version, JsonElement rules, string constantsDigest = "")
{
ArgumentException.ThrowIfNullOrWhiteSpace(version);
return new Policy(version, rules, constantsDigest);
}
///
/// Creates an empty policy for testing.
///
public static Policy Empty => new("1.0.0", JsonDocument.Parse("{}").RootElement, "");
}