using System.Collections.Immutable; using System.Text.Json; using System.Text.Json.Serialization; using NJsonSchema; using NJsonSchema.Generation; using NJsonSchema.Generation.SystemTextJson; using Newtonsoft.Json; using StellaOps.Scheduler.Models; var output = args.Length switch { 0 => Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "docs", "schemas")), 1 => Path.GetFullPath(args[0]), _ => throw new ArgumentException("Usage: dotnet run --project tools/PolicySchemaExporter -- [outputDirectory]") }; Directory.CreateDirectory(output); var generatorSettings = new SystemTextJsonSchemaGeneratorSettings { SchemaType = SchemaType.JsonSchema, DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull, SerializerOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, }, }; var generator = new JsonSchemaGenerator(generatorSettings); var exports = ImmutableArray.Create( (FileName: "policy-run-request.schema.json", Type: typeof(PolicyRunRequest)), (FileName: "policy-run-status.schema.json", Type: typeof(PolicyRunStatus)), (FileName: "policy-diff-summary.schema.json", Type: typeof(PolicyDiffSummary)), (FileName: "policy-explain-trace.schema.json", Type: typeof(PolicyExplainTrace)) ); foreach (var export in exports) { var schema = generator.Generate(export.Type); schema.Title = export.Type.Name; schema.AllowAdditionalProperties = false; var outputPath = Path.Combine(output, export.FileName); await File.WriteAllTextAsync(outputPath, schema.ToJson(Formatting.Indented) + Environment.NewLine); Console.WriteLine($"Wrote {outputPath}"); }