From 93d44fb934aad3bd90e31c4747d0940d3b00d84a Mon Sep 17 00:00:00 2001 From: Erwin de Haan Date: Wed, 25 Jun 2025 09:07:26 +0200 Subject: [PATCH 1/2] Make all C# flavors support x-zero-based-enum and add table to documentation --- docs/generators/aspnet-fastendpoints.md | 6 ++++++ docs/generators/aspnetcore.md | 6 ++++++ docs/generators/csharp-functions.md | 6 ++++++ docs/generators/csharp.md | 6 ++++++ .../main/resources/aspnet-fastendpoints/enumClass.mustache | 2 +- .../src/main/resources/aspnetcore/2.0/enumClass.mustache | 2 +- .../src/main/resources/aspnetcore/2.1/enumClass.mustache | 2 +- .../src/main/resources/aspnetcore/3.0/enumClass.mustache | 2 +- .../src/main/resources/csharp-functions/enumClass.mustache | 2 +- .../src/main/resources/csharp-functions/modelEnum.mustache | 2 +- .../main/resources/csharp-functions/modelInnerEnum.mustache | 2 +- 11 files changed, 31 insertions(+), 7 deletions(-) diff --git a/docs/generators/aspnet-fastendpoints.md b/docs/generators/aspnet-fastendpoints.md index 75a31639bdba..9bea7dcc1b30 100644 --- a/docs/generators/aspnet-fastendpoints.md +++ b/docs/generators/aspnet-fastendpoints.md @@ -38,6 +38,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl |useValidators|Enable request validators (https://fast-endpoints.com/docs/validation).| |false| |versioningPrefix|The versioning prefix for the API. Used only if useApiVersioning is true| |v| +## SUPPORTED VENDOR EXTENSIONS + +| Extension name | Description | Applicable for | Default value | +| -------------- | ----------- | -------------- | ------------- | +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false + ## IMPORT MAPPING | Type/Alias | Imports | diff --git a/docs/generators/aspnetcore.md b/docs/generators/aspnetcore.md index 5d0ca08085dc..536238437c5d 100644 --- a/docs/generators/aspnetcore.md +++ b/docs/generators/aspnetcore.md @@ -56,6 +56,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl |useSeparateModelProject|Create a separate project for models| |false| |useSwashbuckle|Uses the Swashbuckle.AspNetCore NuGet package for documentation.| |true| +## SUPPORTED VENDOR EXTENSIONS + +| Extension name | Description | Applicable for | Default value | +| -------------- | ----------- | -------------- | ------------- | +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false + ## IMPORT MAPPING | Type/Alias | Imports | diff --git a/docs/generators/csharp-functions.md b/docs/generators/csharp-functions.md index 8e6a6a98726a..adbd013e65b8 100644 --- a/docs/generators/csharp-functions.md +++ b/docs/generators/csharp-functions.md @@ -48,6 +48,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl |useDateTimeOffset|Use DateTimeOffset to model date-time properties| |false| |useNewtonsoft|Uses the Newtonsoft JSON library.| |true| +## SUPPORTED VENDOR EXTENSIONS + +| Extension name | Description | Applicable for | Default value | +| -------------- | ----------- | -------------- | ------------- | +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false + ## IMPORT MAPPING | Type/Alias | Imports | diff --git a/docs/generators/csharp.md b/docs/generators/csharp.md index a478f11a0afc..8e616302381c 100644 --- a/docs/generators/csharp.md +++ b/docs/generators/csharp.md @@ -57,6 +57,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl |validatable|Generates self-validatable models.| |true| |zeroBasedEnums|Enumerations with string values will start from 0 when true, 1 when false. If not set, enumerations with string values will start from 0 if the first value is 'unknown', case insensitive.| |null| +## SUPPORTED VENDOR EXTENSIONS + +| Extension name | Description | Applicable for | Default value | +| -------------- | ----------- | -------------- | ------------- | +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false + ## IMPORT MAPPING | Type/Alias | Imports | diff --git a/modules/openapi-generator/src/main/resources/aspnet-fastendpoints/enumClass.mustache b/modules/openapi-generator/src/main/resources/aspnet-fastendpoints/enumClass.mustache index c5d6a235dbef..fc8d52f291ce 100644 --- a/modules/openapi-generator/src/main/resources/aspnet-fastendpoints/enumClass.mustache +++ b/modules/openapi-generator/src/main/resources/aspnet-fastendpoints/enumClass.mustache @@ -11,6 +11,6 @@ /// /// Enum {{name}} for {{{value}}} /// - {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}}, + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}}{{^vendorExtensions.x-zero-based-enum}} = {{-index}}{{/vendorExtensions.x-zero-based-enum}}{{/isString}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}} } diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.0/enumClass.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/enumClass.mustache index ba23434982af..d2961f8ea21a 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/2.0/enumClass.mustache +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/enumClass.mustache @@ -13,6 +13,6 @@ /// Enum {{name}} for {{{value}}} /// {{#isString}}[EnumMember(Value = "{{{value}}}")]{{/isString}} - {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}}, + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}}{{^vendorExtensions.x-zero-based-enum}} = {{-index}}{{/vendorExtensions.x-zero-based-enum}}{{/isString}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}} } diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache index cd6595452ae4..ff41d2a3118e 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache @@ -14,6 +14,6 @@ /// Enum {{name}} for {{{value}}} /// {{#isString}}[EnumMember(Value = "{{{value}}}")]{{/isString}} - {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}}, + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}}{{^vendorExtensions.x-zero-based-enum}} = {{-index}}{{/vendorExtensions.x-zero-based-enum}}{{/isString}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}} } diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/enumClass.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/enumClass.mustache index c673f9c35cb1..4e8e5c576775 100644 --- a/modules/openapi-generator/src/main/resources/aspnetcore/3.0/enumClass.mustache +++ b/modules/openapi-generator/src/main/resources/aspnetcore/3.0/enumClass.mustache @@ -14,6 +14,6 @@ /// Enum {{name}} for {{{value}}} /// {{#isString}}[EnumMember(Value = "{{{value}}}")]{{/isString}} - {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}}, + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}}{{^vendorExtensions.x-zero-based-enum}} = {{-index}}{{/vendorExtensions.x-zero-based-enum}}{{/isString}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}} } diff --git a/modules/openapi-generator/src/main/resources/csharp-functions/enumClass.mustache b/modules/openapi-generator/src/main/resources/csharp-functions/enumClass.mustache index cd6595452ae4..ff41d2a3118e 100644 --- a/modules/openapi-generator/src/main/resources/csharp-functions/enumClass.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-functions/enumClass.mustache @@ -14,6 +14,6 @@ /// Enum {{name}} for {{{value}}} /// {{#isString}}[EnumMember(Value = "{{{value}}}")]{{/isString}} - {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}}, + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}}{{^vendorExtensions.x-zero-based-enum}} = {{-index}}{{/vendorExtensions.x-zero-based-enum}}{{/isString}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}} } diff --git a/modules/openapi-generator/src/main/resources/csharp-functions/modelEnum.mustache b/modules/openapi-generator/src/main/resources/csharp-functions/modelEnum.mustache index d3709c5bc947..a4d9d2b13b05 100644 --- a/modules/openapi-generator/src/main/resources/csharp-functions/modelEnum.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-functions/modelEnum.mustache @@ -25,7 +25,7 @@ {{#isString}} [EnumMember(Value = "{{{value}}}")] {{/isString}} - {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}},{{/-last}} + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}}{{^vendorExtensions.x-zero-based-enum}} = {{-index}}{{/vendorExtensions.x-zero-based-enum}}{{/isString}}{{^-last}},{{/-last}} {{/enumVars}} {{/allowableValues}} diff --git a/modules/openapi-generator/src/main/resources/csharp-functions/modelInnerEnum.mustache b/modules/openapi-generator/src/main/resources/csharp-functions/modelInnerEnum.mustache index d2a6d1ef1ce2..d848897eadfd 100644 --- a/modules/openapi-generator/src/main/resources/csharp-functions/modelInnerEnum.mustache +++ b/modules/openapi-generator/src/main/resources/csharp-functions/modelInnerEnum.mustache @@ -20,7 +20,7 @@ {{#isString}} [EnumMember(Value = "{{{value}}}")] {{/isString}} - {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}},{{/-last}} + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}}{{^vendorExtensions.x-zero-based-enum}} = {{-index}}{{/vendorExtensions.x-zero-based-enum}}{{/isString}}{{^-last}},{{/-last}} {{/enumVars}} {{/allowableValues}} From f3ada9b937197ea7709bd89cd4109d10f5fe1ba8 Mon Sep 17 00:00:00 2001 From: Erwin de Haan Date: Fri, 11 Jul 2025 14:35:55 +0200 Subject: [PATCH 2/2] Add the documentation stuff properly --- docs/generators/aspnet-fastendpoints.md | 3 ++- docs/generators/aspnetcore.md | 3 ++- docs/generators/csharp-functions.md | 3 ++- docs/generators/csharp.md | 3 ++- .../java/org/openapitools/codegen/VendorExtension.java | 1 + .../codegen/languages/AbstractCSharpCodegen.java | 9 ++++++++- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/generators/aspnet-fastendpoints.md b/docs/generators/aspnet-fastendpoints.md index 9bea7dcc1b30..5e7e2f1f65fc 100644 --- a/docs/generators/aspnet-fastendpoints.md +++ b/docs/generators/aspnet-fastendpoints.md @@ -42,7 +42,8 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Extension name | Description | Applicable for | Default value | | -------------- | ----------- | -------------- | ------------- | -|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used, zero-based|MODEL|false + ## IMPORT MAPPING diff --git a/docs/generators/aspnetcore.md b/docs/generators/aspnetcore.md index 536238437c5d..4c95558e6f03 100644 --- a/docs/generators/aspnetcore.md +++ b/docs/generators/aspnetcore.md @@ -60,7 +60,8 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Extension name | Description | Applicable for | Default value | | -------------- | ----------- | -------------- | ------------- | -|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used, zero-based|MODEL|false + ## IMPORT MAPPING diff --git a/docs/generators/csharp-functions.md b/docs/generators/csharp-functions.md index adbd013e65b8..60e793502f20 100644 --- a/docs/generators/csharp-functions.md +++ b/docs/generators/csharp-functions.md @@ -52,7 +52,8 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Extension name | Description | Applicable for | Default value | | -------------- | ----------- | -------------- | ------------- | -|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used, zero-based|MODEL|false + ## IMPORT MAPPING diff --git a/docs/generators/csharp.md b/docs/generators/csharp.md index 8e616302381c..e42095155728 100644 --- a/docs/generators/csharp.md +++ b/docs/generators/csharp.md @@ -61,7 +61,8 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Extension name | Description | Applicable for | Default value | | -------------- | ----------- | -------------- | ------------- | -|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used. Zero-based.|MODEL|false +|x-zero-based-enum|When used on an enum, the index will not be generated and the default numbering will be used, zero-based|MODEL|false + ## IMPORT MAPPING diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java index 64ffe79c9b5f..fe97b12695fb 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java @@ -24,6 +24,7 @@ public enum VendorExtension { X_OPERATION_EXTRA_ANNOTATION("x-operation-extra-annotation", ExtensionLevel.OPERATION, "List of custom annotations to be added to operation", null), X_VERSION_PARAM("x-version-param", ExtensionLevel.OPERATION_PARAMETER, "Marker property that tells that this parameter would be used for endpoint versioning. Applicable for headers & query params. true/false", null), X_PATTERN_MESSAGE("x-pattern-message", Arrays.asList(ExtensionLevel.FIELD, ExtensionLevel.OPERATION_PARAMETER), "Add this property whenever you need to customize the invalidation error message for the regex pattern of a variable", null), + X_ZERO_BASED_ENUM("x-zero-based-enum", ExtensionLevel.MODEL, "When used on an enum, the index will not be generated and the default numbering will be used, zero-based", "false"), ; private final String name; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java index 84c47521f1d0..b72a65bcff9e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java @@ -105,7 +105,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen { protected boolean supportNullable = Boolean.FALSE; @Setter protected Boolean zeroBasedEnums = null; - protected static final String zeroBasedEnumVendorExtension = "x-zero-based-enum"; + protected static final String zeroBasedEnumVendorExtension = VendorExtension.X_ZERO_BASED_ENUM.getName(); private final Logger LOGGER = LoggerFactory.getLogger(AbstractCSharpCodegen.class); @@ -2033,6 +2033,13 @@ protected Set getNullableTypes() { throw new RuntimeException("This method should no longer be used."); } + @Override + public List getSupportedVendorExtensions() { + List extensions = super.getSupportedVendorExtensions(); + extensions.add(VendorExtension.X_ZERO_BASED_ENUM); + return extensions; + } + protected Set getValueTypes() { return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double", "DateTime", "DateOnly", "DateTimeOffset", "Guid")); }