Skip to content

Commit 62abd51

Browse files
osjupiterjmini
authored andcommitted
[all] add "x-enum-varnames" extension to control enum varname (#917)
* add "x-enum-varnames" extension to control the naming of the enum parameter name * allow to set different size from target enum
1 parent b8db2af commit 62abd51

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

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

+14
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ public Map<String, Object> postProcessModelsEnum(Map<String, Object> objs) {
287287
enumVar.put("isString", isDataTypeString(cm.dataType));
288288
enumVars.add(enumVar);
289289
}
290+
// if "x-enum-varnames" defined, update varnames
291+
updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions());
290292
cm.allowableValues.put("enumVars", enumVars);
291293
}
292294

@@ -4003,6 +4005,8 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
40034005
enumVar.put("isString", isDataTypeString(dataType));
40044006
enumVars.add(enumVar);
40054007
}
4008+
// if "x-enum-varnames" defined, update varnames
4009+
updateEnumVarsWithExtensions(enumVars, var.getVendorExtensions());
40064010
allowableValues.put("enumVars", enumVars);
40074011

40084012
// handle default value for enum, e.g. available => StatusEnum.AVAILABLE
@@ -4020,6 +4024,16 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
40204024
}
40214025
}
40224026

4027+
private void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions) {
4028+
if (vendorExtensions != null && vendorExtensions.containsKey("x-enum-varnames")) {
4029+
List<String> alias = (List<String>) vendorExtensions.get("x-enum-varnames");
4030+
int size = Math.min(enumVars.size(), alias.size());
4031+
for (int i = 0; i < size; i++) {
4032+
enumVars.get(i).put("name", alias.get(i));
4033+
}
4034+
}
4035+
}
4036+
40234037
/**
40244038
* If the pattern misses the delimiter, add "/" to the beginning and end
40254039
* Otherwise, return the original pattern

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

+86
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,66 @@ public void updateCodegenPropertyEnum() {
306306
Assert.assertEquals(testedEnumVar.getOrDefault("isString", ""), false);
307307
}
308308

309+
@Test
310+
public void updateCodegenPropertyEnumWithExtention() {
311+
{
312+
CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("dog", "cat"), Arrays.asList("DOGVAR", "CATVAR"));
313+
(new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty);
314+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getAllowableValues().get("enumVars");
315+
Assert.assertNotNull(enumVars);
316+
Assert.assertNotNull(enumVars.get(0));
317+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR");
318+
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\"");
319+
Assert.assertNotNull(enumVars.get(1));
320+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR");
321+
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\"");
322+
}
323+
{
324+
CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("1", "2"), Arrays.asList("ONE", "TWO"));
325+
(new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty);
326+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getAllowableValues().get("enumVars");
327+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ONE");
328+
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"1\"");
329+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "TWO");
330+
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"2\"");
331+
}
332+
{
333+
CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b", "c", "d"), Arrays.asList("FOO", "BAR"));
334+
(new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty);
335+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getAllowableValues().get("enumVars");
336+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO");
337+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR");
338+
Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "C");
339+
Assert.assertEquals(enumVars.get(3).getOrDefault("name", ""), "D");
340+
}
341+
{
342+
CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b"), Arrays.asList("FOO", "BAR", "BAZ"));
343+
(new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty);
344+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getAllowableValues().get("enumVars");
345+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO");
346+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR");
347+
Assert.assertEquals(enumVars.size(), 2);
348+
}
349+
}
350+
351+
@Test
352+
public void postProcessModelsEnumWithExtention() {
353+
final DefaultCodegen codegen = new DefaultCodegen();
354+
Map<String, Object> objs = codegenModelWithXEnumVarName();
355+
CodegenModel cm = (CodegenModel) ((Map<String, Object>) ((List<Object>) objs.get("models")).get(0)).get("model");
356+
357+
codegen.postProcessModelsEnum(objs);
358+
359+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) cm.getAllowableValues().get("enumVars");
360+
Assert.assertNotNull(enumVars);
361+
Assert.assertNotNull(enumVars.get(0));
362+
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR");
363+
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\"");
364+
Assert.assertNotNull(enumVars.get(1));
365+
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR");
366+
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\"");
367+
}
368+
309369
@Test
310370
public void testExample1() {
311371
final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/examples.yaml", null, new ParseOptions()).getOpenAPI();
@@ -478,4 +538,30 @@ private CodegenProperty codegenPropertyWithArrayOfIntegerValues() {
478538
array.dataType = "Array";
479539
return array;
480540
}
541+
542+
private CodegenProperty codegenPropertyWithXEnumVarName(List<String> values, List<String> aliases) {
543+
final CodegenProperty var = new CodegenProperty();
544+
final HashMap<String, Object> allowableValues = new HashMap<>();
545+
allowableValues.put("values", values);
546+
var.setAllowableValues(allowableValues);
547+
var.dataType = "String";
548+
Map<String, Object> extentions = Collections.singletonMap("x-enum-varnames", aliases);
549+
var.setVendorExtensions(extentions);
550+
return var;
551+
}
552+
553+
private Map<String, Object> codegenModelWithXEnumVarName() {
554+
final CodegenModel cm = new CodegenModel();
555+
cm.isEnum = true;
556+
final HashMap<String, Object> allowableValues = new HashMap<>();
557+
allowableValues.put("values", Arrays.asList("dog", "cat"));
558+
cm.setAllowableValues(allowableValues);
559+
cm.dataType = "String";
560+
final List<String> aliases = Arrays.asList("DOGVAR", "CATVAR");
561+
Map<String, Object> extentions = Collections.singletonMap("x-enum-varnames", aliases);
562+
cm.setVendorExtensions(extentions);
563+
cm.setVars(Collections.emptyList());
564+
Map<String, Object> objs = Collections.singletonMap("models", Collections.singletonList(Collections.singletonMap("model", cm)));
565+
return objs;
566+
}
481567
}

0 commit comments

Comments
 (0)