From 3b79e9cf7ef6355251a927529e9c105f39c314d5 Mon Sep 17 00:00:00 2001 From: Mads Larsen Date: Sat, 20 Sep 2025 16:50:09 +0200 Subject: [PATCH] feat: configure enum as string --- .../Extensions/OpenApiOptionsExtensions.cs | 18 ++++++++++++- ...beAllEnumsAsStringsSchemaTransformation.cs | 27 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/OpenApi.Extensions/Schemas/DescribeAllEnumsAsStringsSchemaTransformation.cs diff --git a/src/OpenApi.Extensions/Extensions/OpenApiOptionsExtensions.cs b/src/OpenApi.Extensions/Extensions/OpenApiOptionsExtensions.cs index 67f8ecb..7175a6b 100644 --- a/src/OpenApi.Extensions/Extensions/OpenApiOptionsExtensions.cs +++ b/src/OpenApi.Extensions/Extensions/OpenApiOptionsExtensions.cs @@ -8,6 +8,7 @@ using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using OpenApi.Extensions.Options; +using OpenApi.Extensions.Schemas; using OpenApi.Extensions.Transformers; using OpenApi.Extensions.Transformers.Documents; using OpenApi.Extensions.Transformers.Operations; @@ -42,7 +43,11 @@ public static OpenApiOptions AddOAuth2ImplicitFlow(this OpenApiOptions options, var opt = new ImplicitFlowOptions(); configure(opt); - options.AddDocumentTransformer(new OAuth2ImplicitFlowDocumentTransformation(opt.SecurityScheme, opt.TokenEndpoint, opt.AuthorizationEndpoint, opt.Description, opt.Scopes)); + options.AddDocumentTransformer(new OAuth2ImplicitFlowDocumentTransformation(opt.SecurityScheme, + opt.TokenEndpoint, + opt.AuthorizationEndpoint, + opt.Description, + opt.Scopes)); return options; } @@ -495,6 +500,17 @@ public static OpenApiOptions AddType(this OpenApiOptions optio return options; } + /// + /// Instructs the generator to represent all enum values as strings rather than their numeric values in the generated OpenAPI specification. + /// + /// The OpenAPI options to configure. + /// The updated instance. + public static OpenApiOptions DescribeAllEnumsAsStrings(this OpenApiOptions options) + { + options.AddSchemaTransformer(); + return options; + } + private static string FormatJson(T obj, JsonSerializerOptions? jsonSerializerOptions) { var formatToJson = JsonSerializer.Serialize(obj, jsonSerializerOptions); diff --git a/src/OpenApi.Extensions/Schemas/DescribeAllEnumsAsStringsSchemaTransformation.cs b/src/OpenApi.Extensions/Schemas/DescribeAllEnumsAsStringsSchemaTransformation.cs new file mode 100644 index 0000000..def2295 --- /dev/null +++ b/src/OpenApi.Extensions/Schemas/DescribeAllEnumsAsStringsSchemaTransformation.cs @@ -0,0 +1,27 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.OpenApi; +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Models; + +namespace OpenApi.Extensions.Schemas; + +public class DescribeAllEnumsAsStringsSchemaTransformation : IOpenApiSchemaTransformer +{ + public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext context, CancellationToken cancellationToken) + { + if (context.JsonTypeInfo.Type is { IsEnum: true }) + { + schema.Enum.Clear(); + Enum.GetNames(context.JsonTypeInfo.Type) + .ToList() + .ForEach(name => schema.Enum.Add(new OpenApiString($"{name}"))); + + schema.Type = "string"; + } + + return Task.CompletedTask; + } +}