From 783119b687995a6d5837eb3d6ab7044028a6f2bb Mon Sep 17 00:00:00 2001 From: Samuel Kahn <48932506+Kahncode@users.noreply.github.com> Date: Wed, 20 Mar 2024 04:26:54 +0100 Subject: [PATCH] [cpp-ue4] Handled nullable by setting the required tag, effectively making nullables optionals (even if they may be required in the spec). This is because there is no such concept as a value being nullable in C++, and this generator deals with values, not pointers. (#18168) Co-authored-by: Samuel Kahn --- .../languages/CppUE4ClientCodegen.java | 32 +++++++++++++++++++ .../resources/cpp-ue4/helpers-header.mustache | 9 ++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java index 9ac111edaf3..099734ab37c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java @@ -20,6 +20,10 @@ import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenType; +import org.openapitools.codegen.CodegenModel; +import org.openapitools.codegen.CodegenParameter; +import org.openapitools.codegen.CodegenProperty; +import org.openapitools.codegen.CodegenResponse; import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.meta.GeneratorMetadata; import org.openapitools.codegen.meta.Stability; @@ -246,6 +250,34 @@ public class CppUE4ClientCodegen extends AbstractCppCodegen { this.optionalProjectFileFlag = flag; } + // override to post-process any model properties + @Override + @SuppressWarnings("unused") + public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { + super.postProcessModelProperty(model, property); + // Nullable will be handled as optional + property.required = !property.notRequiredOrIsNullable(); + } + + // override to post-process any response + @Override + @SuppressWarnings("unused") + public void postProcessResponseWithProperty(CodegenResponse response, CodegenProperty property) { + super.postProcessResponseWithProperty(response, property); + // Nullable will be handled as optional + property.required = !property.notRequiredOrIsNullable(); + } + + // override to post-process any parameters + @Override + @SuppressWarnings("unused") + public void postProcessParameter(CodegenParameter parameter) { + super.postProcessParameter(parameter); + // Nullable will be handled as optional + parameter.required = !parameter.notRequiredOrIsNullable(); + } + + /** * Configures the type of generator. * diff --git a/modules/openapi-generator/src/main/resources/cpp-ue4/helpers-header.mustache b/modules/openapi-generator/src/main/resources/cpp-ue4/helpers-header.mustache index c991f9269fd..d551cd8969a 100644 --- a/modules/openapi-generator/src/main/resources/cpp-ue4/helpers-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-ue4/helpers-header.mustache @@ -448,10 +448,11 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonObject, const FSt template inline bool TryGetJsonValue(const TSharedPtr& JsonObject, const FString& Key, TOptional& OptionalValue) { - if(JsonObject->HasField(Key)) + const TSharedPtr JsonValue = JsonObject->TryGetField(Key); + if (JsonValue.IsValid() && !JsonValue->IsNull()) { T Value; - if (TryGetJsonValue(JsonObject, Key, Value)) + if (TryGetJsonValue(JsonValue, Value)) { OptionalValue = Value; return true; @@ -459,7 +460,9 @@ inline bool TryGetJsonValue(const TSharedPtr& JsonObject, const FSt else return false; } - return true; // Absence of optional value is not a parsing error + // Absence of optional value is not a parsing error. + // Nullable is handled like optional. + return true; } {{#cppNamespaceDeclarations}}