Skip to content

Commit 9b893ef

Browse files
scottdallamurajimschubert
authored andcommitted
[C#] allow customization of generated enum suffixes (#4301)
* [C#] allow customization of generated enum suffixes
1 parent 38185d8 commit 9b893ef

File tree

5 files changed

+79
-5
lines changed

5 files changed

+79
-5
lines changed

docs/generators/aspnetcore.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ sidebar_label: aspnetcore
2727
|useNewtonsoft|Uses the Newtonsoft JSON library.| |true|
2828
|newtonsoftVersion|Version for Microsoft.AspNetCore.Mvc.NewtonsoftJson for ASP.NET Core 3.0+| |3.0.0-preview5-19227-01|
2929
|useDefaultRouting|Use default routing for the ASP.NET Core version. For 3.0 turn off default because it is not yet supported.| |true|
30+
|enumNameSuffix|Suffix that will be appended to all enum names.| |Enum|
31+
|enumValueNameSuffix|Suffix that will be appended to all enum value names.| |Enum|
3032
|classModifier|Class Modifier can be empty, abstract| ||
3133
|operationModifier|Operation Modifier can be virtual, abstract or partial| |virtual|
3234
|buildTarget|Target to build an application or library| |program|

modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case,
224224
public static final String MODEL_NAME_SUFFIX = "modelNameSuffix";
225225
public static final String MODEL_NAME_SUFFIX_DESC = "Suffix that will be appended to all model names.";
226226

227+
public static final String ENUM_NAME_SUFFIX = "enumNameSuffix";
228+
public static final String ENUM_NAME_SUFFIX_DESC = "Suffix that will be appended to all enum names.";
229+
230+
public static final String ENUM_VALUE_NAME_SUFFIX = "enumValueNameSuffix";
231+
public static final String ENUM_VALUE_NAME_SUFFIX_DESC = "Suffix that will be appended to all enum value names.";
232+
227233
public static final String GIT_HOST = "gitHost";
228234
public static final String GIT_HOST_DESC = "Git host, e.g. gitlab.com.";
229235

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
6262
protected String packageAuthors = "OpenAPI";
6363

6464
protected String interfacePrefix = "I";
65+
protected String enumNameSuffix = "Enum";
66+
protected String enumValueNameSuffix = "Enum";
6567

6668
protected String sourceFolder = "src";
6769

@@ -361,6 +363,14 @@ public void processOpts() {
361363
}
362364
}
363365

366+
if (additionalProperties().containsKey(CodegenConstants.ENUM_NAME_SUFFIX)) {
367+
setEnumNameSuffix(additionalProperties.get(CodegenConstants.ENUM_NAME_SUFFIX).toString());
368+
}
369+
370+
if (additionalProperties().containsKey(CodegenConstants.ENUM_VALUE_NAME_SUFFIX)) {
371+
setEnumValueNameSuffix(additionalProperties.get(CodegenConstants.ENUM_VALUE_NAME_SUFFIX).toString());
372+
}
373+
364374
// This either updates additionalProperties with the above fixes, or sets the default if the option was not specified.
365375
additionalProperties.put(CodegenConstants.INTERFACE_PREFIX, interfacePrefix);
366376
}
@@ -1003,6 +1013,14 @@ public void setInterfacePrefix(final String interfacePrefix) {
10031013
this.interfacePrefix = interfacePrefix;
10041014
}
10051015

1016+
public void setEnumNameSuffix(final String enumNameSuffix) {
1017+
this.enumNameSuffix = enumNameSuffix;
1018+
}
1019+
1020+
public void setEnumValueNameSuffix(final String enumValueNameSuffix) {
1021+
this.enumValueNameSuffix = enumValueNameSuffix;
1022+
}
1023+
10061024
public boolean isSupportNullable() {
10071025
return supportNullable;
10081026
}
@@ -1040,7 +1058,7 @@ public String toEnumVarName(String name, String datatype) {
10401058
enumName = enumName.replaceFirst("^_", "");
10411059
enumName = enumName.replaceFirst("_$", "");
10421060

1043-
enumName = camelize(enumName) + "Enum";
1061+
enumName = camelize(enumName) + this.enumValueNameSuffix;
10441062

10451063
if (enumName.matches("\\d.*")) { // starts with number
10461064
return "_" + enumName;
@@ -1051,7 +1069,7 @@ public String toEnumVarName(String name, String datatype) {
10511069

10521070
@Override
10531071
public String toEnumName(CodegenProperty property) {
1054-
return sanitizeName(camelize(property.name)) + "Enum";
1072+
return sanitizeName(camelize(property.name)) + this.enumNameSuffix;
10551073
}
10561074

10571075
public String testPackageName() {

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AspNetCoreServerCodegen.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,11 +206,18 @@ public AspNetCoreServerCodegen() {
206206
"Version for Microsoft.AspNetCore.Mvc.NewtonsoftJson for ASP.NET Core 3.0+",
207207
newtonsoftVersion);
208208

209-
210209
addSwitch(USE_DEFAULT_ROUTING,
211210
"Use default routing for the ASP.NET Core version. For 3.0 turn off default because it is not yet supported.",
212211
useDefaultRouting);
213212

213+
addOption(CodegenConstants.ENUM_NAME_SUFFIX,
214+
CodegenConstants.ENUM_NAME_SUFFIX_DESC,
215+
enumNameSuffix);
216+
217+
addOption(CodegenConstants.ENUM_VALUE_NAME_SUFFIX,
218+
CodegenConstants.ENUM_VALUE_NAME_SUFFIX_DESC,
219+
enumValueNameSuffix);
220+
214221
classModifier.addEnum("", "Keep class default with no modifier");
215222
classModifier.addEnum("abstract", "Make class abstract");
216223
classModifier.setDefault("");
@@ -348,7 +355,6 @@ public void processOpts() {
348355
supportingFiles.add(new SupportingFile("Project.nuspec.mustache", packageFolder, packageName + ".nuspec"));
349356
}
350357

351-
352358
if (useSwashbuckle) {
353359
supportingFiles.add(new SupportingFile("Filters" + File.separator + "BasePathFilter.mustache",
354360
packageFolder + File.separator + "Filters", "BasePathFilter.cs"));

modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpModelEnumTest.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,21 @@
1616
*/
1717

1818
package org.openapitools.codegen.csharp;
19-
19+
import io.swagger.v3.oas.models.OpenAPI;
2020
import io.swagger.v3.oas.models.media.Schema;
2121
import io.swagger.v3.oas.models.media.StringSchema;
22+
import org.openapitools.codegen.CodegenModel;
23+
import org.openapitools.codegen.CodegenProperty;
2224
import org.openapitools.codegen.DefaultCodegen;
25+
import org.openapitools.codegen.TestUtils;
26+
import org.openapitools.codegen.languages.AspNetCoreServerCodegen;
2327
import org.openapitools.codegen.languages.CSharpClientCodegen;
28+
import org.testng.Assert;
2429
import org.testng.annotations.Test;
2530

2631
import java.util.Arrays;
2732
import java.util.HashMap;
33+
import java.util.List;
2834
import java.util.Map;
2935

3036
public class CsharpModelEnumTest {
@@ -86,4 +92,40 @@ public void overrideEnumTest() {
8692
Assert.assertTrue(enumVar.isEnum);
8793
*/
8894
}
95+
96+
@Test(description = "use default suffixes for enums")
97+
public void useDefaultEnumSuffixes() {
98+
final AspNetCoreServerCodegen codegen = new AspNetCoreServerCodegen();
99+
100+
OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
101+
codegen.setOpenAPI(openAPI);
102+
103+
final Schema petSchema = openAPI.getComponents().getSchemas().get("Pet");
104+
final CodegenModel cm = codegen.fromModel("Pet", petSchema);
105+
final CodegenProperty statusProperty = cm.vars.get(5);
106+
Assert.assertEquals(statusProperty.name, "Status");
107+
Assert.assertTrue(statusProperty.isEnum);
108+
Assert.assertEquals(statusProperty.datatypeWithEnum, "StatusEnum");
109+
110+
Assert.assertEquals(codegen.toEnumVarName("Aaaa", ""), "AaaaEnum");
111+
}
112+
113+
@Test(description = "use custom suffixes for enums")
114+
public void useCustomEnumSuffixes() {
115+
final AspNetCoreServerCodegen codegen = new AspNetCoreServerCodegen();
116+
codegen.setEnumNameSuffix("EnumName");
117+
codegen.setEnumValueNameSuffix("EnumValue");
118+
119+
OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
120+
codegen.setOpenAPI(openAPI);
121+
122+
final Schema petSchema = openAPI.getComponents().getSchemas().get("Pet");
123+
final CodegenModel cm = codegen.fromModel("Pet", petSchema);
124+
final CodegenProperty statusProperty = cm.vars.get(5);
125+
Assert.assertEquals(statusProperty.name, "Status");
126+
Assert.assertTrue(statusProperty.isEnum);
127+
Assert.assertEquals(statusProperty.datatypeWithEnum, "StatusEnumName");
128+
129+
Assert.assertEquals(codegen.toEnumVarName("Aaaa", ""), "AaaaEnumValue");
130+
}
89131
}

0 commit comments

Comments
 (0)