Skip to content

Commit c13067d

Browse files
YurzelTomáš Čermák
andauthored
[Protobuf-Schema] Add unknown to enum switch (#10892)
* [Protobuf-Schema] Add unknown to enum switch * [Protobuf-Schema] Bugfix: unique unknown by prefix * [Protobuf-Schema] Add unknown to enum switch * [Protobuf-Schema] Bugfix: unique unknown by prefix * [Protobuf-Schema] Bugfix after merge, format file * [Docs][Protobuf-Schema] Generated docs Co-authored-by: Tomáš Čermák <cermak@merica.cz>
1 parent c7bd3aa commit c13067d

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

docs/generators/protobuf-schema.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
77

88
| Option | Description | Values | Default |
99
| ------ | ----------- | ------ | ------- |
10+
|startEnumsWithUnknown|Introduces &quot;UNKNOWN&quot; as the first element of enumerations.| |false|
1011

1112
## IMPORT MAPPING
1213

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

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,14 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf
4747

4848
private static final String IMPORTS = "imports";
4949

50+
public static final String START_ENUMS_WITH_UNKNOWN = "startEnumsWithUnknown";
51+
5052
private final Logger LOGGER = LoggerFactory.getLogger(ProtobufSchemaCodegen.class);
5153

5254
protected String packageName = "openapitools";
5355

56+
private boolean startEnumsWithUnknown = false;
57+
5458
@Override
5559
public CodegenType getTag() {
5660
return CodegenType.SCHEMA;
@@ -145,6 +149,7 @@ public ProtobufSchemaCodegen() {
145149

146150
cliOptions.clear();
147151

152+
addSwitch(START_ENUMS_WITH_UNKNOWN, "Introduces \"UNKNOWN\" as the first element of enumerations.", startEnumsWithUnknown);
148153
}
149154

150155
@Override
@@ -164,6 +169,10 @@ public void processOpts() {
164169
setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME));
165170
}
166171

172+
if (additionalProperties.containsKey(this.START_ENUMS_WITH_UNKNOWN)) {
173+
this.startEnumsWithUnknown = convertPropertyToBooleanAndWriteBack(START_ENUMS_WITH_UNKNOWN);
174+
}
175+
167176
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
168177
}
169178

@@ -183,7 +192,27 @@ public String toOperationId(String operationId) {
183192
return camelize(sanitizeName(operationId));
184193
}
185194

186-
public void addEnumIndexes(List<Map<String, Object>> enumVars){
195+
public void addUnknownToAllowableValues(Map<String, Object> allowableValues, String name) {
196+
if(startEnumsWithUnknown) {
197+
if(allowableValues.containsKey("enumVars")) {
198+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>)allowableValues.get("enumVars");
199+
200+
HashMap<String, Object> unknown = new HashMap<String, Object>();
201+
unknown.put("name", name + "_UNKNOWN");
202+
unknown.put("isString", "false");
203+
unknown.put("value", "\"" + name + "_UNKNOWN\"");
204+
205+
enumVars.add(0, unknown);
206+
}
207+
208+
if(allowableValues.containsKey("values")) {
209+
List<String> values = (List<String>)allowableValues.get("values");
210+
values.add(0, name + "_UNKNOWN");
211+
}
212+
}
213+
}
214+
215+
public void addEnumIndexes(List<Map<String, Object>> enumVars) {
187216
int enumIndex = 0;
188217
for (Map<String, Object> enumVar : enumVars) {
189218
enumVar.put("protobuf-enum-index", enumIndex);
@@ -202,6 +231,8 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
202231

203232
if(cm.isEnum) {
204233
Map<String, Object> allowableValues = cm.getAllowableValues();
234+
addUnknownToAllowableValues(allowableValues, cm.getClassname());
235+
205236
if (allowableValues.containsKey("enumVars")) {
206237
List<Map<String, Object>> enumVars = (List<Map<String, Object>>)allowableValues.get("enumVars");
207238
addEnumIndexes(enumVars);
@@ -224,9 +255,13 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
224255
}
225256
}
226257

227-
if (var.isEnum && var.allowableValues.containsKey("enumVars")) {
228-
List<Map<String, Object>> enumVars = (List<Map<String, Object>>)var.allowableValues.get("enumVars");
229-
addEnumIndexes(enumVars);
258+
if (var.isEnum) {
259+
addUnknownToAllowableValues(var.allowableValues, var.getEnumName());
260+
261+
if(var.allowableValues.containsKey("enumVars")) {
262+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) var.allowableValues.get("enumVars");
263+
addEnumIndexes(enumVars);
264+
}
230265
}
231266

232267
// Add x-protobuf-index, unless already specified

0 commit comments

Comments
 (0)