Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/generators/protobuf-schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -145,6 +149,7 @@ public ProtobufSchemaCodegen() {

cliOptions.clear();

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

@Override
Expand All @@ -164,6 +169,10 @@ public void processOpts() {
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"));
}

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

public void addEnumIndexes(List<Map<String, Object>> enumVars){
public void addUnknownToAllowableValues(Map<String, Object> allowableValues, String name) {
if(startEnumsWithUnknown) {
if(allowableValues.containsKey("enumVars")) {
List<Map<String, Object>> enumVars = (List<Map<String, Object>>)allowableValues.get("enumVars");

HashMap<String, Object> unknown = new HashMap<String, Object>();
unknown.put("name", name + "_UNKNOWN");
unknown.put("isString", "false");
unknown.put("value", "\"" + name + "_UNKNOWN\"");

enumVars.add(0, unknown);
}

if(allowableValues.containsKey("values")) {
List<String> values = (List<String>)allowableValues.get("values");
values.add(0, name + "_UNKNOWN");
}
}
}

public void addEnumIndexes(List<Map<String, Object>> enumVars) {
int enumIndex = 0;
for (Map<String, Object> enumVar : enumVars) {
enumVar.put("protobuf-enum-index", enumIndex);
Expand All @@ -202,6 +231,8 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {

if(cm.isEnum) {
Map<String, Object> allowableValues = cm.getAllowableValues();
addUnknownToAllowableValues(allowableValues, cm.getClassname());

if (allowableValues.containsKey("enumVars")) {
List<Map<String, Object>> enumVars = (List<Map<String, Object>>)allowableValues.get("enumVars");
addEnumIndexes(enumVars);
Expand All @@ -224,9 +255,13 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
}
}

if (var.isEnum && var.allowableValues.containsKey("enumVars")) {
List<Map<String, Object>> enumVars = (List<Map<String, Object>>)var.allowableValues.get("enumVars");
addEnumIndexes(enumVars);
if (var.isEnum) {
addUnknownToAllowableValues(var.allowableValues, var.getEnumName());

if(var.allowableValues.containsKey("enumVars")) {
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) var.allowableValues.get("enumVars");
addEnumIndexes(enumVars);
}
}

// Add x-protobuf-index, unless already specified
Expand Down