@@ -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