From f1ad3a89e6d078c9cc378fb6759445ad47ea221c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20=C4=8Cerm=C3=A1k?= Date: Thu, 17 Feb 2022 17:32:34 +0100 Subject: [PATCH] [Protobuf-Schema] Add enum prefix (#11548) * [Protobuf-Schema] Add enum prefix * [Protobuf-Schema] Documentation updated * [Protobuf-Schema] Samples updated --- .../languages/ProtobufSchemaCodegen.java | 53 ++++++++++++++++--- .../protobuf-schema/models/order.proto | 6 +-- .../petstore/protobuf-schema/models/pet.proto | 6 +-- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java index 769d143091d..4d8e4657e74 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java @@ -209,26 +209,62 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf return camelize(sanitizeName(operationId)); } - public void addUnknownToAllowableValues(Map allowableValues, String name) { + /** + * Adds prefix to the enum allowable values + * NOTE: Enum values use C++ scoping rules, meaning that enum values are siblings of their type, not children of it. Therefore, enum value must be unique + * + * @param allowableValues allowable values + * @param prefix added prefix + */ + public void addEnumValuesPrefix(Map allowableValues, String prefix){ + if(allowableValues.containsKey("enumVars")) { + List> enumVars = (List>)allowableValues.get("enumVars"); + + for(Map value : enumVars) { + String name = (String)value.get("name"); + value.put("name", prefix + "_" + name); + value.put("value", "\"" + prefix + "_" + name + "\""); + } + } + + if(allowableValues.containsKey("values")) { + List values = (List)allowableValues.get("values"); + for(String value : values) { + value = prefix + "_" + value; + } + } + } + + /** + * Adds unknown value to the enum allowable values + * + * @param allowableValues allowable values + */ + public void addUnknownToAllowableValues(Map allowableValues) { if(startEnumsWithUnknown) { if(allowableValues.containsKey("enumVars")) { List> enumVars = (List>)allowableValues.get("enumVars"); - + HashMap unknown = new HashMap(); - unknown.put("name", name + "_UNKNOWN"); + unknown.put("name", "UNKNOWN"); unknown.put("isString", "false"); - unknown.put("value", "\"" + name + "_UNKNOWN\""); + unknown.put("value", "\"UNKNOWN\""); enumVars.add(0, unknown); } if(allowableValues.containsKey("values")) { List values = (List)allowableValues.get("values"); - values.add(0, name + "_UNKNOWN"); + values.add(0, "UNKNOWN"); } } } + /** + * Iterates enum vars and puts index to them + * + * @param enumVars list of enum vars + */ public void addEnumIndexes(List> enumVars) { int enumIndex = 0; for (Map enumVar : enumVars) { @@ -248,8 +284,8 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf if(cm.isEnum) { Map allowableValues = cm.getAllowableValues(); - addUnknownToAllowableValues(allowableValues, cm.getClassname()); - + addUnknownToAllowableValues(allowableValues); + addEnumValuesPrefix(allowableValues, cm.getClassname()); if (allowableValues.containsKey("enumVars")) { List> enumVars = (List>)allowableValues.get("enumVars"); addEnumIndexes(enumVars); @@ -277,7 +313,8 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf } if (var.isEnum) { - addUnknownToAllowableValues(var.allowableValues, var.getEnumName()); + addUnknownToAllowableValues(var.allowableValues); + addEnumValuesPrefix(var.allowableValues, var.getEnumName()); if(var.allowableValues.containsKey("enumVars")) { List> enumVars = (List>) var.allowableValues.get("enumVars"); diff --git a/samples/config/petstore/protobuf-schema/models/order.proto b/samples/config/petstore/protobuf-schema/models/order.proto index 27cded1f00e..4ca4bff35d4 100644 --- a/samples/config/petstore/protobuf-schema/models/order.proto +++ b/samples/config/petstore/protobuf-schema/models/order.proto @@ -25,9 +25,9 @@ message Order { // Order Status enum StatusEnum { - PLACED = 0; - APPROVED = 1; - DELIVERED = 2; + StatusEnum_PLACED = 0; + StatusEnum_APPROVED = 1; + StatusEnum_DELIVERED = 2; } StatusEnum status = 355610639; diff --git a/samples/config/petstore/protobuf-schema/models/pet.proto b/samples/config/petstore/protobuf-schema/models/pet.proto index 41ed4b7a9fc..e92a0ca33d6 100644 --- a/samples/config/petstore/protobuf-schema/models/pet.proto +++ b/samples/config/petstore/protobuf-schema/models/pet.proto @@ -29,9 +29,9 @@ message Pet { // pet status in the store enum StatusEnum { - AVAILABLE = 0; - PENDING = 1; - SOLD = 2; + StatusEnum_AVAILABLE = 0; + StatusEnum_PENDING = 1; + StatusEnum_SOLD = 2; } StatusEnum status = 355610639;