From 5fa58d24870896e04780616a4fdeda425bc6393a Mon Sep 17 00:00:00 2001 From: glopesdev Date: Thu, 18 Jan 2024 14:20:08 +0000 Subject: [PATCH] Support inline oneOf discriminated properties --- Bonsai.Sgen/JsonSchemaExtensions.cs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Bonsai.Sgen/JsonSchemaExtensions.cs b/Bonsai.Sgen/JsonSchemaExtensions.cs index 526014e..2bcf3d8 100644 --- a/Bonsai.Sgen/JsonSchemaExtensions.cs +++ b/Bonsai.Sgen/JsonSchemaExtensions.cs @@ -15,17 +15,41 @@ public static JsonSchema WithUniqueDiscriminatorProperties(this JsonSchema schem class DiscriminatorSchemaVisitor : JsonSchemaVisitorBase { - public DiscriminatorSchemaVisitor(object rootObject) + public DiscriminatorSchemaVisitor(JsonSchema rootObject) { RootObject = rootObject; } - public object RootObject { get; } + public JsonSchema RootObject { get; } protected override JsonSchema VisitSchema(JsonSchema schema, string path, string typeNameHint) { if (schema.DiscriminatorObject != null) { + if (schema is JsonSchemaProperty schemaProperty) + { + if (!RootObject.Definitions.ContainsKey(typeNameHint)) + { + var discriminatorSchema = new JsonSchema(); + discriminatorSchema.DiscriminatorObject = schemaProperty.DiscriminatorObject; + discriminatorSchema.IsAbstract = schemaProperty.IsAbstract; + foreach (var derivedSchema in schemaProperty.OneOf) + { + if (derivedSchema.IsNullable(SchemaType.JsonSchema)) + { + continue; + } + + derivedSchema.ActualSchema.AllOf.Add(new JsonSchema { Reference = discriminatorSchema }); + } + RootObject.Definitions.Add(typeNameHint, discriminatorSchema); + } + + schemaProperty.DiscriminatorObject = null; + schemaProperty.IsAbstract = false; + return schema; + } + foreach (var derivedSchema in schema.GetDerivedSchemas(RootObject).Keys) { foreach (var property in derivedSchema.Properties.Keys.ToList())