using StellaOps.Policy; using System.CommandLine; namespace StellaOps.Policy.Tools; public static class PolicyDslValidatorCommand { public static RootCommand Build(IPolicyValidationRunner runner, CancellationToken? cancellationTokenOverride = null) { var root = new RootCommand("Validate StellaOps policy DSL files."); Configure(root, runner, cancellationTokenOverride); return root; } public static Command BuildCommand(IPolicyValidationRunner runner, CancellationToken? cancellationTokenOverride = null) { var command = new Command("policy-dsl-validate", "Validate StellaOps policy DSL files."); Configure(command, runner, cancellationTokenOverride); return command; } private static void Configure(Command command, IPolicyValidationRunner runner, CancellationToken? cancellationTokenOverride) { var inputs = new Argument>("inputs") { Description = "Policy files, directories, or globs to validate.", Arity = ArgumentArity.OneOrMore }; var strict = new Option("--strict", new[] { "-s" }) { Description = "Treat warnings as errors." }; var outputJson = new Option("--json", new[] { "-j" }) { Description = "Emit machine-readable JSON output." }; command.Add(inputs); command.Add(strict); command.Add(outputJson); command.SetAction(async (parseResult, cancellationToken) => { var options = new PolicyValidationCliOptions { Inputs = parseResult.GetValue(inputs) ?? new List(), Strict = parseResult.GetValue(strict), OutputJson = parseResult.GetValue(outputJson), }; var effectiveCancellationToken = cancellationTokenOverride ?? cancellationToken; return await runner.RunAsync(options, effectiveCancellationToken); }); } }