Skip to content

Commit 361209d

Browse files
committed
Support integer discriminators in OpenAPI polymorphism
Added support for integer type discriminators in OpenAPI schema generation for polymorphic types. Discriminator property type, value, and default are now set dynamically based on the discriminator's type (string or integer). The discriminator property name is consistently determined and defaults to "$type" if unspecified.
1 parent 35a7fa7 commit 361209d

1 file changed

Lines changed: 18 additions & 6 deletions

File tree

src/SignalR.OpenApi/Generation/SignalROpenApiDocumentGenerator.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -723,9 +723,17 @@ private void AddPolymorphicSubEndpoints(
723723
return;
724724
}
725725

726+
var discriminatorPropertyName = polymorphicAttr.TypeDiscriminatorPropertyName ?? "$type";
727+
726728
foreach (var derived in derivedTypes)
727729
{
728-
var discriminatorValue = derived.TypeDiscriminator as string;
730+
var discriminatorValue = derived.TypeDiscriminator switch
731+
{
732+
string s => s,
733+
int i => i.ToString(System.Globalization.CultureInfo.InvariantCulture),
734+
_ => null,
735+
};
736+
729737
if (discriminatorValue is null)
730738
{
731739
continue;
@@ -736,11 +744,15 @@ private void AddPolymorphicSubEndpoints(
736744

737745
// Add the discriminator property as a read-only constant.
738746
derivedSchema.Properties ??= new Dictionary<string, OpenApiSchema>();
739-
derivedSchema.Properties[polymorphicAttr.TypeDiscriminatorPropertyName] = new OpenApiSchema
747+
derivedSchema.Properties[discriminatorPropertyName] = new OpenApiSchema
740748
{
741-
Type = "string",
742-
Enum = [new Microsoft.OpenApi.Any.OpenApiString(discriminatorValue)],
743-
Default = new Microsoft.OpenApi.Any.OpenApiString(discriminatorValue),
749+
Type = derived.TypeDiscriminator is string ? "string" : "integer",
750+
Enum = derived.TypeDiscriminator is string
751+
? [new Microsoft.OpenApi.Any.OpenApiString(discriminatorValue)]
752+
: [new Microsoft.OpenApi.Any.OpenApiInteger(int.Parse(discriminatorValue, System.Globalization.CultureInfo.InvariantCulture))],
753+
Default = derived.TypeDiscriminator is string
754+
? new Microsoft.OpenApi.Any.OpenApiString(discriminatorValue)
755+
: new Microsoft.OpenApi.Any.OpenApiInteger(int.Parse(discriminatorValue, System.Globalization.CultureInfo.InvariantCulture)),
744756
ReadOnly = true,
745757
};
746758

@@ -784,7 +796,7 @@ private void AddPolymorphicSubEndpoints(
784796
isClientEvent: false,
785797
parameterCount: 1,
786798
flattenedBody: true,
787-
discriminatorProperty: polymorphicAttr.TypeDiscriminatorPropertyName,
799+
discriminatorProperty: discriminatorPropertyName,
788800
discriminatorValue: discriminatorValue);
789801

790802
document.Paths[subPathKey] = new OpenApiPathItem

0 commit comments

Comments
 (0)