diff --git a/docs/generators/protobuf-schema.md b/docs/generators/protobuf-schema.md index 104a47fe59c..53e5334ef97 100644 --- a/docs/generators/protobuf-schema.md +++ b/docs/generators/protobuf-schema.md @@ -7,6 +7,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | +|startEnumsWithUnknown|Introduces "UNKNOWN" as the first element of enumerations.| |false| ## IMPORT MAPPING 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 58ec9c56b67..30a8b4c3c32 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 @@ -47,10 +47,14 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf private static final String IMPORTS = "imports"; + public static final String START_ENUMS_WITH_UNKNOWN = "startEnumsWithUnknown"; + private final Logger LOGGER = LoggerFactory.getLogger(ProtobufSchemaCodegen.class); protected String packageName = "openapitools"; + private boolean startEnumsWithUnknown = false; + @Override public CodegenType getTag() { return CodegenType.SCHEMA; @@ -145,6 +149,7 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf cliOptions.clear(); + addSwitch(START_ENUMS_WITH_UNKNOWN, "Introduces \"UNKNOWN\" as the first element of enumerations.", startEnumsWithUnknown); } @Override @@ -164,6 +169,10 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); } + if (additionalProperties.containsKey(this.START_ENUMS_WITH_UNKNOWN)) { + this.startEnumsWithUnknown = convertPropertyToBooleanAndWriteBack(START_ENUMS_WITH_UNKNOWN); + } + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); } @@ -183,7 +192,27 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf return camelize(sanitizeName(operationId)); } - public void addEnumIndexes(List> enumVars){ + public void addUnknownToAllowableValues(Map allowableValues, String name) { + if(startEnumsWithUnknown) { + if(allowableValues.containsKey("enumVars")) { + List> enumVars = (List>)allowableValues.get("enumVars"); + + HashMap unknown = new HashMap(); + unknown.put("name", name + "_UNKNOWN"); + unknown.put("isString", "false"); + unknown.put("value", "\"" + name + "_UNKNOWN\""); + + enumVars.add(0, unknown); + } + + if(allowableValues.containsKey("values")) { + List values = (List)allowableValues.get("values"); + values.add(0, name + "_UNKNOWN"); + } + } + } + + public void addEnumIndexes(List> enumVars) { int enumIndex = 0; for (Map enumVar : enumVars) { enumVar.put("protobuf-enum-index", enumIndex); @@ -202,6 +231,8 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf if(cm.isEnum) { Map allowableValues = cm.getAllowableValues(); + addUnknownToAllowableValues(allowableValues, cm.getClassname()); + if (allowableValues.containsKey("enumVars")) { List> enumVars = (List>)allowableValues.get("enumVars"); addEnumIndexes(enumVars); @@ -224,9 +255,13 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf } } - if (var.isEnum && var.allowableValues.containsKey("enumVars")) { - List> enumVars = (List>)var.allowableValues.get("enumVars"); - addEnumIndexes(enumVars); + if (var.isEnum) { + addUnknownToAllowableValues(var.allowableValues, var.getEnumName()); + + if(var.allowableValues.containsKey("enumVars")) { + List> enumVars = (List>) var.allowableValues.get("enumVars"); + addEnumIndexes(enumVars); + } } // Add x-protobuf-index, unless already specified