Skip to content

Commit 9732589

Browse files
authored
[csharp-netcore] Fixed handling of nullable enum values (#6112)
* [csharp-netcore] Fixed handling of nullable enum values * Update sample code * Remove unnecessary method calls
1 parent 6439990 commit 9732589

File tree

23 files changed

+264
-345
lines changed

23 files changed

+264
-345
lines changed

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
417417
final Map<String, Object> processed = super.postProcessAllModels(objs);
418418
postProcessEnumRefs(processed);
419419
updateValueTypeProperty(processed);
420+
updateNullableTypeProperty(processed);
420421
return processed;
421422
}
422423

@@ -603,6 +604,25 @@ protected void updateValueTypeProperty(Map<String, Object> models) {
603604
}
604605
}
605606

607+
/**
608+
* Update property if it is a C# nullable type
609+
*
610+
* @param models list of all models
611+
*/
612+
protected void updateNullableTypeProperty(Map<String, Object> models) {
613+
for (Map.Entry<String, Object> entry : models.entrySet()) {
614+
String openAPIName = entry.getKey();
615+
CodegenModel model = ModelUtils.getModelByName(openAPIName, models);
616+
if (model != null) {
617+
for (CodegenProperty var : model.vars) {
618+
if (!var.isContainer && (nullableType.contains(var.dataType) || var.isEnum)) {
619+
var.vendorExtensions.put("x-csharp-value-type", true);
620+
}
621+
}
622+
}
623+
}
624+
}
625+
606626
@Override
607627
public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> objs, List<Object> allModels) {
608628
super.postProcessOperationsWithModels(objs, allModels);
@@ -678,6 +698,9 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
678698
}
679699
}
680700
}
701+
} else {
702+
// Effectively mark enum models as enums
703+
updateCodegenParametersEnum(operation.allParams, allModels);
681704
}
682705

683706
processOperation(operation);
@@ -692,6 +715,37 @@ protected void processOperation(CodegenOperation operation) {
692715
// default noop
693716
}
694717

718+
private void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<Object> allModels) {
719+
for (CodegenParameter parameter : parameters) {
720+
CodegenModel model = null;
721+
for (Object modelHashMap : allModels) {
722+
CodegenModel codegenModel = ((HashMap<String, CodegenModel>) modelHashMap).get("model");
723+
if (codegenModel.getClassname().equals(parameter.dataType)) {
724+
model = codegenModel;
725+
break;
726+
}
727+
}
728+
729+
if (model != null) {
730+
// Effectively mark enum models as enums and non-nullable
731+
if (model.isEnum) {
732+
parameter.isEnum = true;
733+
parameter.allowableValues = model.allowableValues;
734+
parameter.isPrimitiveType = true;
735+
parameter.vendorExtensions.put("x-csharp-value-type", true);
736+
}
737+
}
738+
739+
if (!parameter.isContainer && nullableType.contains(parameter.dataType)) {
740+
parameter.vendorExtensions.put("x-csharp-value-type", true);
741+
}
742+
743+
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
744+
parameter.dataType = parameter.dataType + "?";
745+
}
746+
}
747+
}
748+
695749
@Override
696750
public String apiFileFolder() {
697751
return outputFolder + File.separator + sourceFolder + File.separator + packageName + File.separator + apiPackage();

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -423,10 +423,6 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
423423
postProcessEmitDefaultValue(property.vendorExtensions);
424424

425425
super.postProcessModelProperty(model, property);
426-
427-
if (!property.isContainer && (nullableType.contains(property.dataType) || property.isEnum)) {
428-
property.vendorExtensions.put("x-csharp-value-type", true);
429-
}
430426
}
431427

432428
@Override
@@ -461,14 +457,6 @@ public void postProcessParameter(CodegenParameter parameter) {
461457
postProcessPattern(parameter.pattern, parameter.vendorExtensions);
462458
postProcessEmitDefaultValue(parameter.vendorExtensions);
463459
super.postProcessParameter(parameter);
464-
465-
if (nullableType.contains(parameter.dataType)) {
466-
if (!parameter.required) { //optional
467-
parameter.dataType = parameter.dataType + "?";
468-
} else {
469-
parameter.vendorExtensions.put("x-csharp-value-type", true);
470-
}
471-
}
472460
}
473461

474462
/*

modules/openapi-generator/src/main/resources/csharp-netcore/api.mustache

Lines changed: 58 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -256,36 +256,48 @@ namespace {{packageName}}.{{apiPackage}}
256256
if (localVarAccept != null) localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
257257

258258
{{#pathParams}}
259-
{{^vendorExtensions.x-csharp-value-type}}
259+
{{#required}}
260+
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter
261+
{{/required}}
262+
{{^required}}
260263
if ({{paramName}} != null)
264+
{
261265
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter
262-
{{/vendorExtensions.x-csharp-value-type}}
263-
{{#vendorExtensions.x-csharp-value-type}}
264-
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter
265-
{{/vendorExtensions.x-csharp-value-type}}
266+
}
267+
{{/required}}
266268
{{/pathParams}}
267269
{{#queryParams}}
268-
{{^vendorExtensions.x-csharp-value-type}}
270+
{{#required}}
271+
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
272+
{{/required}}
273+
{{^required}}
269274
if ({{paramName}} != null)
270275
{
271276
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
272277
}
273-
{{/vendorExtensions.x-csharp-value-type}}
274-
{{#vendorExtensions.x-csharp-value-type}}
275-
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
276-
{{/vendorExtensions.x-csharp-value-type}}
278+
{{/required}}
277279
{{/queryParams}}
278280
{{#headerParams}}
279-
{{^vendorExtensions.x-csharp-value-type}}
281+
{{#required}}
282+
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter
283+
{{/required}}
284+
{{^required}}
280285
if ({{paramName}} != null)
286+
{
281287
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter
282-
{{/vendorExtensions.x-csharp-value-type}}
283-
{{#vendorExtensions.x-csharp-value-type}}
284-
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter
285-
{{/vendorExtensions.x-csharp-value-type}}
288+
}
289+
{{/required}}
286290
{{/headerParams}}
287291
{{#formParams}}
288-
{{^vendorExtensions.x-csharp-value-type}}
292+
{{#required}}
293+
{{#isFile}}
294+
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}});
295+
{{/isFile}}
296+
{{^isFile}}
297+
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter
298+
{{/isFile}}
299+
{{/required}}
300+
{{^required}}
289301
if ({{paramName}} != null)
290302
{
291303
{{#isFile}}
@@ -295,15 +307,7 @@ namespace {{packageName}}.{{apiPackage}}
295307
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter
296308
{{/isFile}}
297309
}
298-
{{/vendorExtensions.x-csharp-value-type}}
299-
{{#vendorExtensions.x-csharp-value-type}}
300-
{{#isFile}}
301-
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}});
302-
{{/isFile}}
303-
{{^isFile}}
304-
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter
305-
{{/isFile}}
306-
{{/vendorExtensions.x-csharp-value-type}}
310+
{{/required}}
307311
{{/formParams}}
308312
{{#bodyParam}}
309313
localVarRequestOptions.Data = {{paramName}};
@@ -415,36 +419,48 @@ namespace {{packageName}}.{{apiPackage}}
415419
localVarRequestOptions.HeaderParameters.Add("Accept", _accept);
416420

417421
{{#pathParams}}
418-
{{^vendorExtensions.x-csharp-value-type}}
422+
{{#required}}
423+
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter
424+
{{/required}}
425+
{{^required}}
419426
if ({{paramName}} != null)
427+
{
420428
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter
421-
{{/vendorExtensions.x-csharp-value-type}}
422-
{{#vendorExtensions.x-csharp-value-type}}
423-
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter
424-
{{/vendorExtensions.x-csharp-value-type}}
429+
}
430+
{{/required}}
425431
{{/pathParams}}
426432
{{#queryParams}}
427-
{{^vendorExtensions.x-csharp-value-type}}
433+
{{#required}}
434+
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
435+
{{/required}}
436+
{{^required}}
428437
if ({{paramName}} != null)
429438
{
430439
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
431440
}
432-
{{/vendorExtensions.x-csharp-value-type}}
433-
{{#vendorExtensions.x-csharp-value-type}}
434-
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));
435-
{{/vendorExtensions.x-csharp-value-type}}
441+
{{/required}}
436442
{{/queryParams}}
437443
{{#headerParams}}
438-
{{^vendorExtensions.x-csharp-value-type}}
444+
{{#required}}
445+
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter
446+
{{/required}}
447+
{{^required}}
439448
if ({{paramName}} != null)
449+
{
440450
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter
441-
{{/vendorExtensions.x-csharp-value-type}}
442-
{{#vendorExtensions.x-csharp-value-type}}
443-
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter
444-
{{/vendorExtensions.x-csharp-value-type}}
451+
}
452+
{{/required}}
445453
{{/headerParams}}
446454
{{#formParams}}
447-
{{^vendorExtensions.x-csharp-value-type}}
455+
{{#required}}
456+
{{#isFile}}
457+
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}});
458+
{{/isFile}}
459+
{{^isFile}}
460+
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter
461+
{{/isFile}}
462+
{{/required}}
463+
{{^required}}
448464
if ({{paramName}} != null)
449465
{
450466
{{#isFile}}
@@ -454,15 +470,7 @@ namespace {{packageName}}.{{apiPackage}}
454470
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter
455471
{{/isFile}}
456472
}
457-
{{/vendorExtensions.x-csharp-value-type}}
458-
{{#vendorExtensions.x-csharp-value-type}}
459-
{{#isFile}}
460-
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}});
461-
{{/isFile}}
462-
{{^isFile}}
463-
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter
464-
{{/isFile}}
465-
{{/vendorExtensions.x-csharp-value-type}}
473+
{{/required}}
466474
{{/formParams}}
467475
{{#bodyParam}}
468476
localVarRequestOptions.Data = {{paramName}};

0 commit comments

Comments
 (0)