From f186960902bcbef0c752b8f558690d2e71dd5bd0 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Thu, 27 Aug 2026 16:46:42 +0200 Subject: [PATCH 01/13] fix(cpp-httplib-server): generate top-level enum models --- .../cpp-httplib-server/model-header.mustache | 33 +++++++++++ .../cpp-httplib-server/model-source.mustache | 6 ++ .../CppHttplibServerCodegenModelTest.java | 21 ++++--- .../3_0/cpp-httplib-server/feature-test.json | 4 ++ .../feature-test/models/TopLevelStatus.cpp | 7 +++ .../feature-test/models/TopLevelStatus.h | 59 +++++++++++++++++++ 6 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp create mode 100644 samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache index fa0176786b67..d29ae7b7ee05 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache @@ -5,6 +5,7 @@ {{#model}} // System headers #include +#include {{#vendorExtensions.filteredImports}} {{{.}}} {{/vendorExtensions.filteredImports}} @@ -16,6 +17,37 @@ namespace {{vendorExtensions.modelNamespace}} { +{{#isEnum}} +enum class {{vendorExtensions.modelClassName}} { + {{#allowableValues}}{{#enumVars}} + {{name}}{{^-last}},{{/-last}} + {{/enumVars}}{{/allowableValues}} +}; + +inline void to_json(nlohmann::json& j, const {{vendorExtensions.modelClassName}}& value) +{ + switch (value) + { + {{#allowableValues}}{{#enumVars}} + case {{vendorExtensions.modelClassName}}::{{name}}: j = {{#isString}}"{{value}}"{{/isString}}{{^isString}}{{value}}{{/isString}}; break; + {{/enumVars}}{{/allowableValues}} + } +} + +inline void from_json(const nlohmann::json& j, {{vendorExtensions.modelClassName}}& value) +{ + {{#allowableValues}}{{#enumVars}} + if (j == {{#isString}}"{{value}}"{{/isString}}{{^isString}}{{value}}{{/isString}}) + { + value = {{vendorExtensions.modelClassName}}::{{name}}; + return; + } + {{/enumVars}}{{/allowableValues}} + throw nlohmann::json::type_error::create(302, "Invalid value for {{vendorExtensions.modelClassName}}", &j); +} + +{{/isEnum}} +{{^isEnum}} {{#vendorExtensions.isOneOfSchema}} // oneOf schema - type alias for std::variant using {{vendorExtensions.modelClassName}} = std::variant< @@ -252,5 +284,6 @@ private: } // namespace {{vendorExtensions.modelNamespace}} +{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache index 414becd4a421..eabdc902a7d8 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache @@ -3,6 +3,11 @@ {{#models}} {{#model}} +{{#isEnum}} +#include "{{vendorExtensions.modelClassName}}.h" + +{{/isEnum}} +{{^isEnum}} {{^vendorExtensions.isOneOfSchema}} {{^vendorExtensions.isAnyOfSchema}} #include "{{vendorExtensions.modelClassName}}.h" @@ -79,5 +84,6 @@ std::string {{classname}}::{{enumName}}ToString({{classname}}::{{enumName}} valu {{^vendorExtensions.isOneOfSchema}}{{^vendorExtensions.isAnyOfSchema}} } // namespace {{vendorExtensions.modelNamespace}} {{/vendorExtensions.isAnyOfSchema}}{{/vendorExtensions.isOneOfSchema}} +{{/isEnum}} {{/model}} {{/models}} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index 0044e8b167a9..e3e26b7603f3 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -274,15 +274,18 @@ public void enumModelTest() { final CodegenModel model = codegen.fromModel("Status", enumSchema); - // Note: The C++ httplib server generator may not process enum-only models - // in the same way as regular object models. The model might be null or empty. - if (model != null) { - Assert.assertEquals(model.name, "Status"); - // Check if it's marked as an enum in vendor extensions - if (model.vendorExtensions.containsKey("x-is-enum")) { - Assert.assertEquals(model.vendorExtensions.get("x-is-enum"), true); - } - } + Assert.assertNotNull(model); + Assert.assertEquals(model.name, "Status"); + Assert.assertTrue(model.isEnum, "top-level enum schemas must remain enum models"); + Assert.assertNotNull(model.allowableValues); + Assert.assertEquals(model.allowableValues.get("values"), + java.util.Arrays.asList("ACTIVE", "INACTIVE", "PENDING")); + + final CodegenModel processedModel = codegen.postProcessAllModels( + wrapForPostProcessAllModels("Status", model)) + .get("Status").getModels().get(0).getModel(); + Assert.assertNotNull(processedModel.vendorExtensions.get("modelClassName")); + Assert.assertEquals(((List) processedModel.allowableValues.get("enumVars")).size(), 3); } @Test(description = "convert model with nullable property") diff --git a/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json b/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json index 2ffb304ceb53..7f61b18fe837 100644 --- a/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json +++ b/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json @@ -1006,6 +1006,10 @@ } } }, + "TopLevelStatus": { + "type": "string", + "enum": ["active", "inactive", "pending"] + }, "SimpleObject": { "type": "object", "required": ["id", "name"], diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp new file mode 100644 index 000000000000..63e676e689e9 --- /dev/null +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp @@ -0,0 +1,7 @@ +/** + * This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +#include "TopLevelStatus.h" \ No newline at end of file diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h new file mode 100644 index 000000000000..8a7697bc5357 --- /dev/null +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h @@ -0,0 +1,59 @@ +/** + * This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +#pragma once +// System headers +#include +#include + +namespace models +{ + + enum class TopLevelStatus + { + ACTIVE, + INACTIVE, + PENDING + }; + + inline void to_json(nlohmann::json &j, const TopLevelStatus &value) + { + switch (value) + { + case TopLevelStatus::ACTIVE: + j = "active"; + break; + case TopLevelStatus::INACTIVE: + j = "inactive"; + break; + case TopLevelStatus::PENDING: + j = "pending"; + break; + } + } + + inline void from_json(const nlohmann::json &j, TopLevelStatus &value) + { + const std::string serializedValue = j.get(); + if (serializedValue == "active") + { + value = TopLevelStatus::ACTIVE; + return; + } + if (serializedValue == "inactive") + { + value = TopLevelStatus::INACTIVE; + return; + } + if (serializedValue == "pending") + { + value = TopLevelStatus::PENDING; + return; + } + throw nlohmann::json::type_error::create(302, "Invalid value for TopLevelStatus", &j); + } + +} // namespace models \ No newline at end of file From c877a328ccbba5d8fa36b8b63424a9e0fd64ec67 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Fri, 28 Aug 2026 11:15:37 +0200 Subject: [PATCH 02/13] fix(cpp-httplib-server): preserve enum string values --- .../cpp-httplib-server/model-header.mustache | 4 ++-- .../CppHttplibServerCodegenModelTest.java | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache index d29ae7b7ee05..375746e52313 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache @@ -29,7 +29,7 @@ inline void to_json(nlohmann::json& j, const {{vendorExtensions.modelClassName}} switch (value) { {{#allowableValues}}{{#enumVars}} - case {{vendorExtensions.modelClassName}}::{{name}}: j = {{#isString}}"{{value}}"{{/isString}}{{^isString}}{{value}}{{/isString}}; break; + case {{vendorExtensions.modelClassName}}::{{name}}: j = {{#isString}}"{{{value}}}"{{/isString}}{{^isString}}{{value}}{{/isString}}; break; {{/enumVars}}{{/allowableValues}} } } @@ -37,7 +37,7 @@ inline void to_json(nlohmann::json& j, const {{vendorExtensions.modelClassName}} inline void from_json(const nlohmann::json& j, {{vendorExtensions.modelClassName}}& value) { {{#allowableValues}}{{#enumVars}} - if (j == {{#isString}}"{{value}}"{{/isString}}{{^isString}}{{value}}{{/isString}}) + if (j == {{#isString}}"{{{value}}}"{{/isString}}{{^isString}}{{value}}{{/isString}}) { value = {{vendorExtensions.modelClassName}}::{{name}}; return; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index e3e26b7603f3..cdb521a753a1 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -35,13 +35,17 @@ public class CppHttplibServerCodegenModelTest { * Wraps a single model the way {@link org.openapitools.codegen.DefaultGenerator} * does before calling {@code postProcessAllModels}, so tests can exercise the full * enum vendor-extension pipeline (identifier + original-value derivation), not just - * the intermediate state produced by {@code fromModel}. + * the intermediate state produced by {@code fromModel}. This mirrors + * {@code DefaultGenerator}'s {@code processModels}, which runs {@code postProcessModels} + * (and, for C++, {@code postProcessModelsEnum} with it) before {@code postProcessAllModels} + * is ever invoked. */ - private Map wrapForPostProcessAllModels(String name, CodegenModel model) { + private Map wrapForPostProcessAllModels(CppHttplibServerCodegen codegen, String name, CodegenModel model) { final ModelMap modelMap = new ModelMap(); modelMap.setModel(model); final ModelsMap modelsMap = new ModelsMap(); modelsMap.setModels(Collections.singletonList(modelMap)); + codegen.postProcessModels(modelsMap); final HashMap allModels = new HashMap<>(); allModels.put(name, modelsMap); return allModels; @@ -173,7 +177,7 @@ public void arrayOfEnumsDeclaresValidUpperCaseIdentifiersTest() { final CodegenModel model = codegen.fromModel("ModelWithColorArray", schema); final CodegenModel processedModel = codegen.postProcessAllModels( - wrapForPostProcessAllModels("ModelWithColorArray", model)) + wrapForPostProcessAllModels(codegen, "ModelWithColorArray", model)) .get("ModelWithColorArray").getModels().get(0).getModel(); CodegenProperty arrayProp = processedModel.vars.get(0); @@ -221,7 +225,7 @@ public void numericEnumPropertyTest() { // postProcessAllModels, since that's the single place both the identifier and the // original spec value are derived together (see enumSerializationUsesOriginalSpecValueTest). final CodegenModel processedModel = codegen.postProcessAllModels( - wrapForPostProcessAllModels("UserStatusModel", model)) + wrapForPostProcessAllModels(codegen, "UserStatusModel", model)) .get("UserStatusModel").getModels().get(0).getModel(); CodegenProperty statusProp = processedModel.vars.get(0); Assert.assertTrue((boolean) statusProp.vendorExtensions.getOrDefault("isEnum", false)); @@ -244,7 +248,7 @@ public void enumSerializationUsesOriginalSpecValueTest() { final CodegenModel model = codegen.fromModel("Pet", schema); final CodegenModel processedModel = codegen.postProcessAllModels( - wrapForPostProcessAllModels("Pet", model)) + wrapForPostProcessAllModels(codegen, "Pet", model)) .get("Pet").getModels().get(0).getModel(); CodegenProperty statusProp = processedModel.vars.get(0); @@ -282,7 +286,7 @@ public void enumModelTest() { java.util.Arrays.asList("ACTIVE", "INACTIVE", "PENDING")); final CodegenModel processedModel = codegen.postProcessAllModels( - wrapForPostProcessAllModels("Status", model)) + wrapForPostProcessAllModels(codegen, "Status", model)) .get("Status").getModels().get(0).getModel(); Assert.assertNotNull(processedModel.vendorExtensions.get("modelClassName")); Assert.assertEquals(((List) processedModel.allowableValues.get("enumVars")).size(), 3); From 67be0476e929805564f9f50370c6dbbf3b5e08ec Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Fri, 28 Aug 2026 11:21:28 +0200 Subject: [PATCH 03/13] fix(cpp-httplib-server): regenerate samples --- .../feature-test/.openapi-generator/FILES | 2 + .../cpp-httplib-server/feature-test/README.md | 13 +++ .../feature-test/models/Address.h | 1 + .../feature-test/models/Animal.h | 1 + .../feature-test/models/ArrayTypes.h | 1 + .../feature-test/models/BankAccount.h | 1 + .../feature-test/models/Company.h | 1 + .../feature-test/models/CreatedResponse.h | 1 + .../feature-test/models/CreditCard.h | 1 + .../feature-test/models/Department.h | 1 + .../feature-test/models/Dog.h | 1 + .../feature-test/models/Employee.h | 1 + .../feature-test/models/EnumTypes.h | 1 + .../feature-test/models/ErrorResponse.h | 1 + .../feature-test/models/NotFoundResponse.h | 1 + .../models/NullableOptionalTypes.h | 1 + .../feature-test/models/PaymentMethod.h | 1 + .../feature-test/models/PrimitiveTypes.h | 1 + .../feature-test/models/SimpleObject.h | 1 + .../feature-test/models/StringOrNumber.h | 1 + .../feature-test/models/SuccessResponse.h | 1 + .../models/TestAllParameterTypes200Response.h | 1 + .../models/TestApiKeySecurity200Response.h | 1 + .../models/TestBasicSecurity200Response.h | 1 + .../models/TestBearerSecurity200Response.h | 1 + .../models/TestCookieParameters200Response.h | 1 + .../models/TestHeaderParameters200Response.h | 1 + .../models/TestHeaderParameters401Response.h | 1 + .../models/TestOAuth2Security200Response.h | 1 + .../models/TestQueryParameters200Response.h | 1 + .../TestQueryParametersDeepObjectParameter.h | 1 + .../feature-test/models/TopLevelStatus.cpp | 11 ++- .../feature-test/models/TopLevelStatus.h | 92 ++++++++++--------- .../petstore/models/ApiResponse.h | 1 + .../petstore/models/Category.h | 1 + .../petstore/models/ComplexParamsResponse.h | 1 + .../petstore/models/DeepObj.h | 1 + .../petstore/models/DeepObjBaz.h | 1 + .../petstore/models/NullableExample.h | 1 + .../petstore/models/Order.h | 1 + .../cpp-httplib-server/petstore/models/Pet.h | 1 + .../petstore/models/PetOrCategory.h | 1 + .../cpp-httplib-server/petstore/models/Tag.h | 1 + .../cpp-httplib-server/petstore/models/User.h | 1 + 44 files changed, 109 insertions(+), 49 deletions(-) diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES index 05151c84f82a..01f3994a50bd 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES +++ b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES @@ -68,3 +68,5 @@ models/TestQueryParameters200Response.cpp models/TestQueryParameters200Response.h models/TestQueryParametersDeepObjectParameter.cpp models/TestQueryParametersDeepObjectParameter.h +models/TopLevelStatus.cpp +models/TopLevelStatus.h diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/README.md b/samples/server/petstore/cpp-httplib-server/feature-test/README.md index 8889a4d4cb6f..b6591f3252ba 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/README.md +++ b/samples/server/petstore/cpp-httplib-server/feature-test/README.md @@ -520,6 +520,19 @@ std::string jsonString = json.dump(); // Deserialize from JSON auto parsedModel = models::TestQueryParametersDeepObjectParameter::fromJson(nlohmann::json::parse(jsonString)); ``` +#### models::TopLevelStatus + +```cpp +// Create a model +auto model = models::TopLevelStatus(); + +// Serialize to JSON +nlohmann::json json = models::TopLevelStatus::toJson(model); +std::string jsonString = json.dump(); + +// Deserialize from JSON +auto parsedModel = models::TopLevelStatus::fromJson(nlohmann::json::parse(jsonString)); +``` ## Implementing API Handlers diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h index eaf778a713e4..b717d2a02bce 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h index e3f179bc7196..37b7a93b84c3 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h index 2f93f30e1416..88323e405e9b 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h index e5d88115e447..9e2a10abd336 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h index acb61e0db444..28edd1949363 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h @@ -8,6 +8,7 @@ // System headers #include #include +#include #include #include "Address.h" #include "Department.h" diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h index b3f94e4cec83..aec3a2aa2f4c 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h index f53af49ef132..1c38e890da34 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h index fa133c2bed92..a3ed69779cc0 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h @@ -8,6 +8,7 @@ // System headers #include #include +#include #include #include "Employee.h" diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h index fc075c18b8bd..505ef3d3d876 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h index 1a7bb642a773..9df3f9937035 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h index 6ea087bf17e3..911a1dffb7f4 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h index 72f143d780e9..45afc8e79090 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h index 9b209b5d3f2e..ec9c422109f8 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h index 7e5df57ad443..7b39df5194e2 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h index 0f5d86c9fae5..b6a9b3be4d0e 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include "BankAccount.h" diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h index 89894663074b..342d3bf2e543 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h index eae83fbbe860..f77ee90b3f55 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h index 5e6d40483e0e..ffa37b185ebc 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h index a6de84bce543..7bda20bd017b 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h index ce9ade6be871..0b594a8f2e7d 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h index f2ebdc38cc2d..cc0f028b3b90 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h index c2a923e72215..03d276255ce4 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h index 0cb7cbe8421d..e42970411c6c 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h index a5548cc28b0d..b0d9e493026e 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h index cb091980a63d..83bee433420b 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h index 7b6e0d5ed738..f2b693fbe6ab 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h index 8e232d4866a2..03197fd1f788 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h index 7b7b05c4d919..b9c6432ec21b 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h index 76d6f4edeaea..ce3874ad27d3 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp index 63e676e689e9..96ebc0c7a965 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.cpp @@ -1,7 +1,8 @@ + /** - * This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ +* This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +#include "TopLevelStatus.h" -#include "TopLevelStatus.h" \ No newline at end of file diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h index 8a7697bc5357..d0670c4fb733 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h @@ -1,59 +1,63 @@ /** - * This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ +* This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ #pragma once // System headers #include #include -namespace models -{ - enum class TopLevelStatus - { - ACTIVE, - INACTIVE, - PENDING - }; - inline void to_json(nlohmann::json &j, const TopLevelStatus &value) +namespace models { + +enum class TopLevelStatus { + + ACTIVE, + + INACTIVE, + + PENDING + +}; + +inline void to_json(nlohmann::json& j, const TopLevelStatus& value) +{ + switch (value) { - switch (value) - { - case TopLevelStatus::ACTIVE: - j = "active"; - break; - case TopLevelStatus::INACTIVE: - j = "inactive"; - break; - case TopLevelStatus::PENDING: - j = "pending"; - break; - } + + case TopLevelStatus::ACTIVE: j = active; break; + + case TopLevelStatus::INACTIVE: j = inactive; break; + + case TopLevelStatus::PENDING: j = pending; break; + } +} - inline void from_json(const nlohmann::json &j, TopLevelStatus &value) +inline void from_json(const nlohmann::json& j, TopLevelStatus& value) +{ + + if (j == active) + { + value = TopLevelStatus::ACTIVE; + return; + } + + if (j == inactive) + { + value = TopLevelStatus::INACTIVE; + return; + } + + if (j == pending) { - const std::string serializedValue = j.get(); - if (serializedValue == "active") - { - value = TopLevelStatus::ACTIVE; - return; - } - if (serializedValue == "inactive") - { - value = TopLevelStatus::INACTIVE; - return; - } - if (serializedValue == "pending") - { - value = TopLevelStatus::PENDING; - return; - } - throw nlohmann::json::type_error::create(302, "Invalid value for TopLevelStatus", &j); + value = TopLevelStatus::PENDING; + return; } + + throw nlohmann::json::type_error::create(302, "Invalid value for TopLevelStatus", &j); +} -} // namespace models \ No newline at end of file diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h b/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h index 3cb5f3ed9df6..8ba6d49e278c 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h index 432674c5607b..2d407a749aec 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h index eaab72300df9..62e6ef735ce9 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h index 25350d579e94..51fd479648a7 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include "DeepObjBaz.h" diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h index 5220c128694b..b86adda4fc57 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h b/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h index cd532bccb1b8..ca8418e6e24d 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h index 7e7d3aade171..e55ad3538ab8 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h index a120edbd44fc..89e390ad0b15 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h b/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h index 395dfafc31ba..ba4e40bea764 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h index d8255563cdeb..a81f2cf4d7f5 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h @@ -8,6 +8,7 @@ // System headers #include #include +#include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/User.h b/samples/server/petstore/cpp-httplib-server/petstore/models/User.h index ca4e9d5ff0de..6f89a874f232 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/User.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/User.h @@ -7,6 +7,7 @@ #pragma once // System headers #include +#include #include #include #include From ffbc0fa31783b0f4a7a5dcce8fcadd9a13bf1060 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Fri, 28 Aug 2026 11:59:14 +0200 Subject: [PATCH 04/13] fix(cpp-httplib-server): serialize top-level string enums --- .../codegen/languages/CppHttplibServerCodegen.java | 3 +++ .../resources/cpp-httplib-server/README.mustache | 13 +++++++++++++ .../cpp-httplib-server/model-header.mustache | 5 ++--- .../CppHttplibServerCodegenModelTest.java | 2 ++ .../cpp-httplib-server/feature-test/README.md | 12 ++++++------ .../feature-test/models/Address.h | 1 - .../cpp-httplib-server/feature-test/models/Animal.h | 1 - .../feature-test/models/ArrayTypes.h | 1 - .../feature-test/models/BankAccount.h | 1 - .../feature-test/models/Company.h | 1 - .../feature-test/models/CreatedResponse.h | 1 - .../feature-test/models/CreditCard.h | 1 - .../feature-test/models/Department.h | 1 - .../cpp-httplib-server/feature-test/models/Dog.h | 1 - .../feature-test/models/Employee.h | 1 - .../feature-test/models/EnumTypes.h | 1 - .../feature-test/models/ErrorResponse.h | 1 - .../feature-test/models/NotFoundResponse.h | 1 - .../feature-test/models/NullableOptionalTypes.h | 1 - .../feature-test/models/PaymentMethod.h | 1 - .../feature-test/models/PrimitiveTypes.h | 1 - .../feature-test/models/SimpleObject.h | 1 - .../feature-test/models/StringOrNumber.h | 1 - .../feature-test/models/SuccessResponse.h | 1 - .../models/TestAllParameterTypes200Response.h | 1 - .../models/TestApiKeySecurity200Response.h | 1 - .../models/TestBasicSecurity200Response.h | 1 - .../models/TestBearerSecurity200Response.h | 1 - .../models/TestCookieParameters200Response.h | 1 - .../models/TestHeaderParameters200Response.h | 1 - .../models/TestHeaderParameters401Response.h | 1 - .../models/TestOAuth2Security200Response.h | 1 - .../models/TestQueryParameters200Response.h | 1 - .../models/TestQueryParametersDeepObjectParameter.h | 1 - .../feature-test/models/TopLevelStatus.h | 13 ++++++------- .../petstore/models/ApiResponse.h | 1 - .../cpp-httplib-server/petstore/models/Category.h | 1 - .../petstore/models/ComplexParamsResponse.h | 1 - .../cpp-httplib-server/petstore/models/DeepObj.h | 1 - .../cpp-httplib-server/petstore/models/DeepObjBaz.h | 1 - .../petstore/models/NullableExample.h | 1 - .../cpp-httplib-server/petstore/models/Order.h | 1 - .../cpp-httplib-server/petstore/models/Pet.h | 1 - .../petstore/models/PetOrCategory.h | 1 - .../cpp-httplib-server/petstore/models/Tag.h | 1 - .../cpp-httplib-server/petstore/models/User.h | 1 - 46 files changed, 32 insertions(+), 56 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java index 207eb2872e9b..a4460cd03c46 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java @@ -1560,6 +1560,9 @@ public CodegenModel fromModel(String name, Schema schema) { if (model != null) { model.name = toModelName(modelName); model.classname = model.name; + if (model.isEnum) { + model.vendorExtensions.put("isStringEnum", ModelUtils.isStringSchema(schema)); + } if (ModelUtils.hasAllOf(schema) && this.openAPI != null) { int refCount = 0; diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/README.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/README.mustache index 979519ce5c71..a7ab3632f456 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/README.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/README.mustache @@ -97,6 +97,18 @@ The server will start on `http://0.0.0.0:8080` with: #### {{vendorExtensions.modelNamespace}}::{{vendorExtensions.modelClassName}} ```cpp +{{#isEnum}} +// Select an enum value +auto model = {{vendorExtensions.modelNamespace}}::{{vendorExtensions.modelClassName}}::{{#allowableValues}}{{#enumVars}}{{#-first}}{{name}}{{/-first}}{{/enumVars}}{{/allowableValues}}; + +// Serialize to JSON via the generated to_json free function +nlohmann::json json = model; +std::string jsonString = json.dump(); + +// Deserialize from JSON via the generated from_json free function +auto parsedModel = nlohmann::json::parse(jsonString).get<{{vendorExtensions.modelNamespace}}::{{vendorExtensions.modelClassName}}>(); +{{/isEnum}} +{{^isEnum}} // Create a model auto model = {{vendorExtensions.modelNamespace}}::{{vendorExtensions.modelClassName}}(); {{#vars}} @@ -109,6 +121,7 @@ std::string jsonString = json.dump(); // Deserialize from JSON auto parsedModel = {{vendorExtensions.modelNamespace}}::{{vendorExtensions.modelClassName}}::fromJson(nlohmann::json::parse(jsonString)); +{{/isEnum}} ``` {{/model}} {{/models}} diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache index 375746e52313..7aa82b2613ab 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache @@ -5,7 +5,6 @@ {{#model}} // System headers #include -#include {{#vendorExtensions.filteredImports}} {{{.}}} {{/vendorExtensions.filteredImports}} @@ -29,7 +28,7 @@ inline void to_json(nlohmann::json& j, const {{vendorExtensions.modelClassName}} switch (value) { {{#allowableValues}}{{#enumVars}} - case {{vendorExtensions.modelClassName}}::{{name}}: j = {{#isString}}"{{{value}}}"{{/isString}}{{^isString}}{{value}}{{/isString}}; break; + case {{vendorExtensions.modelClassName}}::{{name}}: j = {{#vendorExtensions.isStringEnum}}"{{{value}}}"{{/vendorExtensions.isStringEnum}}{{^vendorExtensions.isStringEnum}}{{value}}{{/vendorExtensions.isStringEnum}}; break; {{/enumVars}}{{/allowableValues}} } } @@ -37,7 +36,7 @@ inline void to_json(nlohmann::json& j, const {{vendorExtensions.modelClassName}} inline void from_json(const nlohmann::json& j, {{vendorExtensions.modelClassName}}& value) { {{#allowableValues}}{{#enumVars}} - if (j == {{#isString}}"{{{value}}}"{{/isString}}{{^isString}}{{value}}{{/isString}}) + if (j == {{#vendorExtensions.isStringEnum}}"{{{value}}}"{{/vendorExtensions.isStringEnum}}{{^vendorExtensions.isStringEnum}}{{value}}{{/vendorExtensions.isStringEnum}}) { value = {{vendorExtensions.modelClassName}}::{{name}}; return; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index cdb521a753a1..51d929804a1e 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -281,6 +281,8 @@ public void enumModelTest() { Assert.assertNotNull(model); Assert.assertEquals(model.name, "Status"); Assert.assertTrue(model.isEnum, "top-level enum schemas must remain enum models"); + Assert.assertEquals(model.vendorExtensions.get("isStringEnum"), true, + "string-backed top-level enums must serialize their values as JSON strings"); Assert.assertNotNull(model.allowableValues); Assert.assertEquals(model.allowableValues.get("values"), java.util.Arrays.asList("ACTIVE", "INACTIVE", "PENDING")); diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/README.md b/samples/server/petstore/cpp-httplib-server/feature-test/README.md index b6591f3252ba..82b04b186bbf 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/README.md +++ b/samples/server/petstore/cpp-httplib-server/feature-test/README.md @@ -523,15 +523,15 @@ auto parsedModel = models::TestQueryParametersDeepObjectParameter::fromJson(nloh #### models::TopLevelStatus ```cpp -// Create a model -auto model = models::TopLevelStatus(); +// Select an enum value +auto model = models::TopLevelStatus::ACTIVE; -// Serialize to JSON -nlohmann::json json = models::TopLevelStatus::toJson(model); +// Serialize to JSON via the generated to_json free function +nlohmann::json json = model; std::string jsonString = json.dump(); -// Deserialize from JSON -auto parsedModel = models::TopLevelStatus::fromJson(nlohmann::json::parse(jsonString)); +// Deserialize from JSON via the generated from_json free function +auto parsedModel = nlohmann::json::parse(jsonString).get(); ``` ## Implementing API Handlers diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h index b717d2a02bce..eaf778a713e4 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Address.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h index 37b7a93b84c3..e3f179bc7196 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Animal.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h index 88323e405e9b..2f93f30e1416 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/ArrayTypes.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h index 9e2a10abd336..e5d88115e447 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/BankAccount.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h index 28edd1949363..acb61e0db444 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Company.h @@ -8,7 +8,6 @@ // System headers #include #include -#include #include #include "Address.h" #include "Department.h" diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h index aec3a2aa2f4c..b3f94e4cec83 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreatedResponse.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h index 1c38e890da34..f53af49ef132 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h index a3ed69779cc0..fa133c2bed92 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Department.h @@ -8,7 +8,6 @@ // System headers #include #include -#include #include #include "Employee.h" diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h index 505ef3d3d876..fc075c18b8bd 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Dog.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h index 9df3f9937035..1a7bb642a773 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/Employee.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h index 911a1dffb7f4..6ea087bf17e3 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h index 45afc8e79090..72f143d780e9 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/ErrorResponse.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h index ec9c422109f8..9b209b5d3f2e 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/NotFoundResponse.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h index 7b39df5194e2..7e5df57ad443 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/NullableOptionalTypes.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h index b6a9b3be4d0e..0f5d86c9fae5 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/PaymentMethod.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include "BankAccount.h" diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h index 342d3bf2e543..89894663074b 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/PrimitiveTypes.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h index f77ee90b3f55..eae83fbbe860 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/SimpleObject.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h index ffa37b185ebc..5e6d40483e0e 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/StringOrNumber.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h index 7bda20bd017b..a6de84bce543 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/SuccessResponse.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h index 0b594a8f2e7d..ce9ade6be871 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestAllParameterTypes200Response.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h index cc0f028b3b90..f2ebdc38cc2d 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestApiKeySecurity200Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h index 03d276255ce4..c2a923e72215 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBasicSecurity200Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h index e42970411c6c..0cb7cbe8421d 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestBearerSecurity200Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h index b0d9e493026e..a5548cc28b0d 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestCookieParameters200Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h index 83bee433420b..cb091980a63d 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters200Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h index f2b693fbe6ab..7b6e0d5ed738 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestHeaderParameters401Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h index 03197fd1f788..8e232d4866a2 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestOAuth2Security200Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h index b9c6432ec21b..7b7b05c4d919 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParameters200Response.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h index ce3874ad27d3..76d6f4edeaea 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TestQueryParametersDeepObjectParameter.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h index d0670c4fb733..c5d9807210a0 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include @@ -28,11 +27,11 @@ inline void to_json(nlohmann::json& j, const TopLevelStatus& value) switch (value) { - case TopLevelStatus::ACTIVE: j = active; break; + case TopLevelStatus::ACTIVE: j = "active"; break; - case TopLevelStatus::INACTIVE: j = inactive; break; + case TopLevelStatus::INACTIVE: j = "inactive"; break; - case TopLevelStatus::PENDING: j = pending; break; + case TopLevelStatus::PENDING: j = "pending"; break; } } @@ -40,19 +39,19 @@ inline void to_json(nlohmann::json& j, const TopLevelStatus& value) inline void from_json(const nlohmann::json& j, TopLevelStatus& value) { - if (j == active) + if (j == "active") { value = TopLevelStatus::ACTIVE; return; } - if (j == inactive) + if (j == "inactive") { value = TopLevelStatus::INACTIVE; return; } - if (j == pending) + if (j == "pending") { value = TopLevelStatus::PENDING; return; diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h b/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h index 8ba6d49e278c..3cb5f3ed9df6 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/ApiResponse.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h index 2d407a749aec..432674c5607b 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Category.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h index 62e6ef735ce9..eaab72300df9 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h index 51fd479648a7..25350d579e94 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObj.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include "DeepObjBaz.h" diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h index b86adda4fc57..5220c128694b 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/DeepObjBaz.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h b/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h index ca8418e6e24d..cd532bccb1b8 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/NullableExample.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h index e55ad3538ab8..7e7d3aade171 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h index 89e390ad0b15..a120edbd44fc 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h b/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h index ba4e40bea764..395dfafc31ba 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/PetOrCategory.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h b/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h index a81f2cf4d7f5..d8255563cdeb 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Tag.h @@ -8,7 +8,6 @@ // System headers #include #include -#include diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/User.h b/samples/server/petstore/cpp-httplib-server/petstore/models/User.h index 6f89a874f232..ca4e9d5ff0de 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/User.h +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/User.h @@ -7,7 +7,6 @@ #pragma once // System headers #include -#include #include #include #include From 24a7af8ff382a959fefdd4b9d5556f63fc4db342 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Thu, 3 Sep 2026 15:05:31 +0200 Subject: [PATCH 05/13] model-header.mustache fix namespace closure --- .../main/resources/cpp-httplib-server/model-header.mustache | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache index 7aa82b2613ab..e32573a76037 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache @@ -281,8 +281,9 @@ private: {{/vendorExtensions.isAnyOfSchema}} {{/vendorExtensions.isOneOfSchema}} +{{/isEnum}} + } // namespace {{vendorExtensions.modelNamespace}} -{{/isEnum}} {{/model}} {{/models}} From f368b5af93bdeee57982fa3d195a09cd1f76b99e Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Thu, 3 Sep 2026 15:58:25 +0200 Subject: [PATCH 06/13] fix comments --- .../languages/CppHttplibServerCodegen.java | 13 ++++++++++++- .../CppHttplibServerCodegenModelTest.java | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java index a4460cd03c46..64c561a05124 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppHttplibServerCodegen.java @@ -1543,6 +1543,17 @@ public String getTypeDeclaration(Schema p) { return typeDecl; } + // untyped enum schemas (no explicit `type: string`) are still string-backed if their values are strings + @SuppressWarnings("rawtypes") + private boolean isStringEnumSchema(Schema schema) { + if (ModelUtils.isStringSchema(schema)) { + return true; + } + List enumValues = schema.getEnum(); + return enumValues != null && !enumValues.isEmpty() + && enumValues.stream().allMatch(value -> value instanceof String); + } + @Override @SuppressWarnings({"rawtypes", "unchecked"}) public CodegenModel fromModel(String name, Schema schema) { @@ -1561,7 +1572,7 @@ public CodegenModel fromModel(String name, Schema schema) { model.name = toModelName(modelName); model.classname = model.name; if (model.isEnum) { - model.vendorExtensions.put("isStringEnum", ModelUtils.isStringSchema(schema)); + model.vendorExtensions.put("isStringEnum", isStringEnumSchema(schema)); } if (ModelUtils.hasAllOf(schema) && this.openAPI != null) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index 51d929804a1e..3970769b2f44 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -294,6 +294,24 @@ public void enumModelTest() { Assert.assertEquals(((List) processedModel.allowableValues.get("enumVars")).size(), 3); } + @Test(description = "convert integer-backed top-level enum model") + public void integerBackedEnumModelTest() { + final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); + codegen.processOpts(); + + IntegerSchema enumSchema = new IntegerSchema(); + enumSchema.setEnum(java.util.Arrays.asList(0, 1, 2)); + + final CodegenModel model = codegen.fromModel("NumericStatus", enumSchema); + + Assert.assertNotNull(model); + Assert.assertTrue(model.isEnum, "top-level enum schemas must remain enum models"); + // model-header.mustache's `{{^vendorExtensions.isStringEnum}}` branch renders these + // values unquoted, so the flag must be false for integer-backed top-level enums. + Assert.assertEquals(model.vendorExtensions.get("isStringEnum"), false, + "integer-backed top-level enums must serialize their values as raw JSON numbers"); + } + @Test(description = "convert model with nullable property") public void nullablePropertyTest() { final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); From 753093ee8fe6595a1ba757ae568d6bd9ac5249ac Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Thu, 3 Sep 2026 16:12:00 +0200 Subject: [PATCH 07/13] regenerate samples --- .../src/main/resources/cpp-httplib-server/model-header.mustache | 1 - .../cpp-httplib-server/feature-test/.openapi-generator/FILES | 1 + .../cpp-httplib-server/feature-test/models/TopLevelStatus.h | 2 ++ .../cpp-httplib-server/petstore/.openapi-generator/FILES | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache index e32573a76037..132a18d3ddc2 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache @@ -282,7 +282,6 @@ private: {{/vendorExtensions.isOneOfSchema}} {{/isEnum}} - } // namespace {{vendorExtensions.modelNamespace}} {{/model}} diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES index 01f3994a50bd..d6162256fb02 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES +++ b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES @@ -1,3 +1,4 @@ +.openapi-generator-ignore CMakeLists.txt LICENSE README.md diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h index c5d9807210a0..03f442525d6d 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h @@ -60,3 +60,5 @@ inline void from_json(const nlohmann::json& j, TopLevelStatus& value) throw nlohmann::json::type_error::create(302, "Invalid value for TopLevelStatus", &j); } +} // namespace models + diff --git a/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES b/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES index cf79c5ee9f1c..bfa1f0fb7ae1 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES +++ b/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES @@ -1,3 +1,4 @@ +.openapi-generator-ignore CMakeLists.txt LICENSE README.md From 385e1c2d3390e0d5989876c4ea22890f8f785ad8 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski <131153254+stefanwitkowskiwmb@users.noreply.github.com> Date: Thu, 3 Sep 2026 14:55:18 +0000 Subject: [PATCH 08/13] generate samples in codespace --- .../cpp-httplib-server/feature-test/.openapi-generator/FILES | 1 - .../cpp-httplib-server/petstore/.openapi-generator/FILES | 1 - 2 files changed, 2 deletions(-) diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES index d6162256fb02..01f3994a50bd 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES +++ b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES @@ -1,4 +1,3 @@ -.openapi-generator-ignore CMakeLists.txt LICENSE README.md diff --git a/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES b/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES index bfa1f0fb7ae1..cf79c5ee9f1c 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES +++ b/samples/server/petstore/cpp-httplib-server/petstore/.openapi-generator/FILES @@ -1,4 +1,3 @@ -.openapi-generator-ignore CMakeLists.txt LICENSE README.md From d20ead3aca8f01902fb56caf9ab95011c81cc2f8 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Fri, 4 Sep 2026 09:42:39 +0200 Subject: [PATCH 09/13] test(cpp-httplib-server): cover string-valued enums with non-string type The isStringEnum fallback added in f368b5af93b had no test that distinguished it from the previous ModelUtils.isStringSchema check. ModelUtils.getType returns the first element of a 3.1 type set, so a `type: [null, string]` enum reports its type as "null": isStringSchema is false while isEnum is true, and model-header.mustache then emits `j = available;` instead of `j = "available";`, which does not compile. Reverting CppHttplibServerCodegen to the plain isStringSchema check makes this test fail. Co-Authored-By: Claude Opus 5 --- .../CppHttplibServerCodegenModelTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index 3970769b2f44..6e11d88b3e64 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -312,6 +312,29 @@ public void integerBackedEnumModelTest() { "integer-backed top-level enums must serialize their values as raw JSON numbers"); } + @Test(description = "convert 3.1 nullable top-level enum model with string values") + public void nullableStringEnumModelTest() { + final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); + codegen.processOpts(); + + // OpenAPI 3.1 `type: [null, string]`. ModelUtils.getType() returns the *first* declared + // type, so ModelUtils.isStringSchema() is false here even though the enum is string-backed. + JsonSchema enumSchema = new JsonSchema(); + enumSchema.addType("null"); + enumSchema.addType("string"); + enumSchema.setEnum(java.util.Arrays.asList("available", "pending", "sold")); + + final CodegenModel model = codegen.fromModel("NullableStatus", enumSchema); + + Assert.assertNotNull(model); + Assert.assertTrue(model.isEnum, "top-level enum schemas must remain enum models"); + // Without the value-based fallback the template would emit `j = available;` instead of + // `j = "available";`, which does not compile. + Assert.assertEquals(model.vendorExtensions.get("isStringEnum"), true, + "string-valued top-level enums must serialize their values as JSON strings even when" + + " the declared type is not plainly `string`"); + } + @Test(description = "convert model with nullable property") public void nullablePropertyTest() { final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); From a2a938d1dc9ae259cd66f7bcd362f04aecdf376c Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Fri, 4 Sep 2026 10:54:08 +0200 Subject: [PATCH 10/13] test(cpp-httplib-server): assert rendered to_json/from_json for top-level enums The existing enum tests only assert the isStringEnum vendor extension on the fromModel result. That flag is just the input to model-header.mustache, so a break in the template itself -- a renamed flag, an inverted section -- passed the whole suite unnoticed. Add a test that builds a string-backed and an integer-backed top-level enum schema, runs DefaultGenerator over them, and asserts on the rendered enum headers: quoted values for the former, bare values for the latter, plus the inverse via assertFileNotContains. Renaming vendorExtensions.isStringEnum throughout model-header.mustache makes it fail. Also add an integer-backed top-level enum to feature-test.json and regenerate its sample. The template's `{{^vendorExtensions.isStringEnum}}` branch had no checked-in sample output, since the spec carried a top-level string enum but no integer one. Co-Authored-By: Claude Opus 5 --- .../CppHttplibServerCodegenModelTest.java | 51 +++++++++++++++ .../3_0/cpp-httplib-server/feature-test.json | 4 ++ .../feature-test/.openapi-generator/FILES | 2 + .../cpp-httplib-server/feature-test/README.md | 13 ++++ .../feature-test/models/TopLevelPriority.cpp | 8 +++ .../feature-test/models/TopLevelPriority.h | 64 +++++++++++++++++++ 6 files changed, 142 insertions(+) create mode 100644 samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.cpp create mode 100644 samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index 6e11d88b3e64..e43732724775 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -19,10 +19,15 @@ import org.openapitools.codegen.languages.CppHttplibServerCodegen; import org.openapitools.codegen.model.ModelMap; import org.openapitools.codegen.model.ModelsMap; +import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.media.*; import org.testng.Assert; import org.testng.annotations.Test; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -335,6 +340,52 @@ public void nullableStringEnumModelTest() { + " the declared type is not plainly `string`"); } + @Test(description = "model-header.mustache must render quoted values for string-backed " + + "top-level enums and bare values for integer-backed ones; the other enum tests " + + "only assert the isStringEnum flag that feeds this template, not its output") + public void topLevelEnumHeadersRenderTypedJsonValuesTest() throws IOException { + final File output = Files.createTempDirectory("cpp-httplib-server-enums").toFile(); + output.deleteOnExit(); + + StringSchema stringEnumSchema = new StringSchema(); + stringEnumSchema.setEnum(java.util.Arrays.asList("active", "inactive", "pending")); + IntegerSchema integerEnumSchema = new IntegerSchema(); + integerEnumSchema.setEnum(java.util.Arrays.asList(0, 1, 2)); + + final OpenAPI openAPI = TestUtils.createOpenAPI(); + openAPI.getComponents().addSchemas("TopLevelStatus", stringEnumSchema); + openAPI.getComponents().addSchemas("TopLevelPriority", integerEnumSchema); + + final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); + codegen.additionalProperties().put("modelNamespace", "models"); + codegen.setOutputDir(output.getAbsolutePath()); + + final List files = new DefaultGenerator() + .opts(new ClientOptInput().openAPI(openAPI).config(codegen)) + .generate(); + files.forEach(File::deleteOnExit); + + // model-header.mustache guards the quoting with `{{#vendorExtensions.isStringEnum}}`, so a + // `type: string` enum must emit quoted values; bare ones would be undeclared identifiers. + final Path stringEnumHeader = output.toPath().resolve("models/TopLevelStatus.h"); + TestUtils.assertFileContains(stringEnumHeader, + "case TopLevelStatus::ACTIVE: j = \"active\"; break;", + "case TopLevelStatus::INACTIVE: j = \"inactive\"; break;", + "case TopLevelStatus::PENDING: j = \"pending\"; break;", + "if (j == \"active\")"); + TestUtils.assertFileNotContains(stringEnumHeader, "j = active;"); + + // ...while the `{{^vendorExtensions.isStringEnum}}` branch must leave a `type: integer` + // enum's values bare, or they serialize as JSON strings instead of numbers. + final Path integerEnumHeader = output.toPath().resolve("models/TopLevelPriority.h"); + TestUtils.assertFileContains(integerEnumHeader, + "case TopLevelPriority::_0: j = 0; break;", + "case TopLevelPriority::_1: j = 1; break;", + "case TopLevelPriority::_2: j = 2; break;", + "if (j == 0)"); + TestUtils.assertFileNotContains(integerEnumHeader, "j = \"0\";"); + } + @Test(description = "convert model with nullable property") public void nullablePropertyTest() { final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); diff --git a/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json b/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json index 7f61b18fe837..703266f4e5c8 100644 --- a/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json +++ b/modules/openapi-generator/src/test/resources/3_0/cpp-httplib-server/feature-test.json @@ -1010,6 +1010,10 @@ "type": "string", "enum": ["active", "inactive", "pending"] }, + "TopLevelPriority": { + "type": "integer", + "enum": [0, 1, 2] + }, "SimpleObject": { "type": "object", "required": ["id", "name"], diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES index 01f3994a50bd..ddbf90077692 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES +++ b/samples/server/petstore/cpp-httplib-server/feature-test/.openapi-generator/FILES @@ -68,5 +68,7 @@ models/TestQueryParameters200Response.cpp models/TestQueryParameters200Response.h models/TestQueryParametersDeepObjectParameter.cpp models/TestQueryParametersDeepObjectParameter.h +models/TopLevelPriority.cpp +models/TopLevelPriority.h models/TopLevelStatus.cpp models/TopLevelStatus.h diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/README.md b/samples/server/petstore/cpp-httplib-server/feature-test/README.md index 82b04b186bbf..1d7d251bbad8 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/README.md +++ b/samples/server/petstore/cpp-httplib-server/feature-test/README.md @@ -520,6 +520,19 @@ std::string jsonString = json.dump(); // Deserialize from JSON auto parsedModel = models::TestQueryParametersDeepObjectParameter::fromJson(nlohmann::json::parse(jsonString)); ``` +#### models::TopLevelPriority + +```cpp +// Select an enum value +auto model = models::TopLevelPriority::_0; + +// Serialize to JSON via the generated to_json free function +nlohmann::json json = model; +std::string jsonString = json.dump(); + +// Deserialize from JSON via the generated from_json free function +auto parsedModel = nlohmann::json::parse(jsonString).get(); +``` #### models::TopLevelStatus ```cpp diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.cpp b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.cpp new file mode 100644 index 000000000000..11115194f6a3 --- /dev/null +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.cpp @@ -0,0 +1,8 @@ + +/** +* This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +#include "TopLevelPriority.h" + diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h new file mode 100644 index 000000000000..eb26d6bc96b0 --- /dev/null +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h @@ -0,0 +1,64 @@ +/** +* This file is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ + +#pragma once +// System headers +#include + + + +namespace models { + +enum class TopLevelPriority { + + _0, + + _1, + + _2 + +}; + +inline void to_json(nlohmann::json& j, const TopLevelPriority& value) +{ + switch (value) + { + + case TopLevelPriority::_0: j = 0; break; + + case TopLevelPriority::_1: j = 1; break; + + case TopLevelPriority::_2: j = 2; break; + + } +} + +inline void from_json(const nlohmann::json& j, TopLevelPriority& value) +{ + + if (j == 0) + { + value = TopLevelPriority::_0; + return; + } + + if (j == 1) + { + value = TopLevelPriority::_1; + return; + } + + if (j == 2) + { + value = TopLevelPriority::_2; + return; + } + + throw nlohmann::json::type_error::create(302, "Invalid value for TopLevelPriority", &j); +} + +} // namespace models + From 501451d87df517b7e95f38dc79f599c90f852684 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Fri, 4 Sep 2026 11:59:50 +0200 Subject: [PATCH 11/13] add default branch to switch in to_json --- .../resources/cpp-httplib-server/model-header.mustache | 1 + .../CppHttplibServerCodegenModelTest.java | 8 ++++++++ .../feature-test/models/TopLevelPriority.h | 1 + .../feature-test/models/TopLevelStatus.h | 1 + 4 files changed, 11 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache index 132a18d3ddc2..dee5ac619e97 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-header.mustache @@ -30,6 +30,7 @@ inline void to_json(nlohmann::json& j, const {{vendorExtensions.modelClassName}} {{#allowableValues}}{{#enumVars}} case {{vendorExtensions.modelClassName}}::{{name}}: j = {{#vendorExtensions.isStringEnum}}"{{{value}}}"{{/vendorExtensions.isStringEnum}}{{^vendorExtensions.isStringEnum}}{{value}}{{/vendorExtensions.isStringEnum}}; break; {{/enumVars}}{{/allowableValues}} + default: throw nlohmann::json::type_error::create(302, "Invalid value for {{vendorExtensions.modelClassName}}", &j); } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index e43732724775..431acb211ddf 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -374,6 +374,11 @@ public void topLevelEnumHeadersRenderTypedJsonValuesTest() throws IOException { "case TopLevelStatus::PENDING: j = \"pending\"; break;", "if (j == \"active\")"); TestUtils.assertFileNotContains(stringEnumHeader, "j = active;"); + // An enumerator outside the declared set must fail loudly rather than leave `j` untouched, + // mirroring the throw that from_json already performs on an unrecognised JSON value. + TestUtils.assertFileContains(stringEnumHeader, + "default: throw nlohmann::json::type_error::create(302, " + + "\"Invalid value for TopLevelStatus\", &j);"); // ...while the `{{^vendorExtensions.isStringEnum}}` branch must leave a `type: integer` // enum's values bare, or they serialize as JSON strings instead of numbers. @@ -384,6 +389,9 @@ public void topLevelEnumHeadersRenderTypedJsonValuesTest() throws IOException { "case TopLevelPriority::_2: j = 2; break;", "if (j == 0)"); TestUtils.assertFileNotContains(integerEnumHeader, "j = \"0\";"); + TestUtils.assertFileContains(integerEnumHeader, + "default: throw nlohmann::json::type_error::create(302, " + + "\"Invalid value for TopLevelPriority\", &j);"); } @Test(description = "convert model with nullable property") diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h index eb26d6bc96b0..4bd408432269 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelPriority.h @@ -33,6 +33,7 @@ inline void to_json(nlohmann::json& j, const TopLevelPriority& value) case TopLevelPriority::_2: j = 2; break; + default: throw nlohmann::json::type_error::create(302, "Invalid value for TopLevelPriority", &j); } } diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h index 03f442525d6d..8fa66f2ae470 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/TopLevelStatus.h @@ -33,6 +33,7 @@ inline void to_json(nlohmann::json& j, const TopLevelStatus& value) case TopLevelStatus::PENDING: j = "pending"; break; + default: throw nlohmann::json::type_error::create(302, "Invalid value for TopLevelStatus", &j); } } From 47dd09b220c7427410c4e69fa3c8bd6788c7aaeb Mon Sep 17 00:00:00 2001 From: Stefan Witkowski Date: Fri, 4 Sep 2026 13:52:04 +0200 Subject: [PATCH 12/13] align exceptions also for nested enum definitions --- .../cpp-httplib-server/model-source.mustache | 4 +-- .../CppHttplibServerCodegenModelTest.java | 34 +++++++++++++++++++ .../feature-test/models/CreditCard.cpp | 4 +-- .../feature-test/models/EnumTypes.cpp | 12 +++---- .../petstore/models/ComplexParamsResponse.cpp | 12 +++---- .../petstore/models/Order.cpp | 4 +-- .../petstore/models/Pet.cpp | 4 +-- .../petstore/models/User.cpp | 4 +-- 8 files changed, 56 insertions(+), 22 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache index eabdc902a7d8..d693ac5a6bd7 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache @@ -61,7 +61,7 @@ std::string {{classname}}::{{enumName}}ToString({{classname}}::{{enumName}} valu {{#vendorExtensions.enumCases}} case {{enumName}}::{{name}}: return "{{value}}"; {{/vendorExtensions.enumCases}} - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for {{classname}}::{{enumName}}"); } } @@ -73,7 +73,7 @@ std::string {{classname}}::{{enumName}}ToString({{classname}}::{{enumName}} valu return {{enumName}}::{{name}}; } {{/vendorExtensions.enumCases}} - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for {{classname}}::{{enumName}}"); } {{/isArray}}{{/isEnum}}{{/vars}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index 431acb211ddf..329ef6aba0e7 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -394,6 +394,40 @@ public void topLevelEnumHeadersRenderTypedJsonValuesTest() throws IOException { + "\"Invalid value for TopLevelPriority\", &j);"); } + @Test(description = "model-source.mustache's ToString and FromString for an enum property " + + "must both throw nlohmann::json::type_error, naming the enum, on an unrecognised " + + "value -- instead of ToString returning an empty string that hides the error, or " + + "FromString's prior message that didn't name the enum") + public void propertyEnumConversionRejectsUnknownValuesTest() throws IOException { + final File output = Files.createTempDirectory("cpp-httplib-server-prop-enums").toFile(); + output.deleteOnExit(); + + StringSchema statusSchema = new StringSchema(); + statusSchema.setEnum(java.util.Arrays.asList("available", "pending", "sold")); + ObjectSchema petSchema = new ObjectSchema(); + petSchema.addProperty("status", statusSchema); + + final OpenAPI openAPI = TestUtils.createOpenAPI(); + openAPI.getComponents().addSchemas("Pet", petSchema); + + final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); + codegen.additionalProperties().put("modelNamespace", "models"); + codegen.setOutputDir(output.getAbsolutePath()); + + final List files = new DefaultGenerator() + .opts(new ClientOptInput().openAPI(openAPI).config(codegen)) + .generate(); + files.forEach(File::deleteOnExit); + + // Property enums (de)serialize through StatusEnumToString/StatusEnumFromString rather + // than the switch/if-chain in model-header.mustache's top-level to_json/from_json, so + // they need their own guard against unknown enumerators -- on both directions. + final Path source = output.toPath().resolve("models/Pet.cpp"); + TestUtils.assertFileContains(source, + "default: throw nlohmann::json::type_error::create(302, \"Invalid value for Pet::StatusEnum\");", + "throw nlohmann::json::type_error::create(302, \"Invalid value for Pet::StatusEnum\");"); + } + @Test(description = "convert model with nullable property") public void nullablePropertyTest() { final CppHttplibServerCodegen codegen = new CppHttplibServerCodegen(); diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp index ffff74cdb7a0..cb2e505e727a 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp @@ -61,7 +61,7 @@ std::string CreditCard::CardTypeEnumToString(CreditCard::CardTypeEnum value) case CardTypeEnum::VISA: return "visa"; case CardTypeEnum::MASTERCARD: return "mastercard"; case CardTypeEnum::AMEX: return "amex"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for CreditCard::CardTypeEnum"); } } @@ -83,7 +83,7 @@ CreditCard::CardTypeEnum CreditCard::CardTypeEnumFromString(const std::string& s { return CardTypeEnum::AMEX; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for CreditCard::CardTypeEnum"); } diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp index 20a0ee4f30a7..8f94282d5f0a 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp @@ -61,7 +61,7 @@ std::string EnumTypes::StringEnumEnumToString(EnumTypes::StringEnumEnum value) case StringEnumEnum::PENDING: return "pending"; case StringEnumEnum::APPROVED: return "approved"; case StringEnumEnum::REJECTED: return "rejected"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StringEnumEnum"); } } @@ -83,7 +83,7 @@ EnumTypes::StringEnumEnum EnumTypes::StringEnumEnumFromString(const std::string& { return StringEnumEnum::REJECTED; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StringEnumEnum"); } // ========================================= @@ -99,7 +99,7 @@ std::string EnumTypes::NumericEnumEnumToString(EnumTypes::NumericEnumEnum value) case NumericEnumEnum::_300: return "300"; case NumericEnumEnum::_404: return "404"; case NumericEnumEnum::_500: return "500"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::NumericEnumEnum"); } } @@ -129,7 +129,7 @@ EnumTypes::NumericEnumEnum EnumTypes::NumericEnumEnumFromString(const std::strin { return NumericEnumEnum::_500; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::NumericEnumEnum"); } // ========================================= @@ -143,7 +143,7 @@ std::string EnumTypes::StatusCodeEnumToString(EnumTypes::StatusCodeEnum value) case StatusCodeEnum::_200: return "200"; case StatusCodeEnum::_404: return "404"; case StatusCodeEnum::_500: return "500"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StatusCodeEnum"); } } @@ -165,7 +165,7 @@ EnumTypes::StatusCodeEnum EnumTypes::StatusCodeEnumFromString(const std::string& { return StatusCodeEnum::_500; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StatusCodeEnum"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp index b8f3c393302d..7cde2b31dc69 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp @@ -88,7 +88,7 @@ std::string ComplexParamsResponse::EnumParamEnumToString(ComplexParamsResponse:: case EnumParamEnum::A: return "A"; case EnumParamEnum::B: return "B"; case EnumParamEnum::C: return "C"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::EnumParamEnum"); } } @@ -110,7 +110,7 @@ ComplexParamsResponse::EnumParamEnum ComplexParamsResponse::EnumParamEnumFromStr { return EnumParamEnum::C; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::EnumParamEnum"); } // ========================================= @@ -124,7 +124,7 @@ std::string ComplexParamsResponse::XEnumHeaderEnumToString(ComplexParamsResponse case XEnumHeaderEnum::X: return "X"; case XEnumHeaderEnum::Y: return "Y"; case XEnumHeaderEnum::Z: return "Z"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::XEnumHeaderEnum"); } } @@ -146,7 +146,7 @@ ComplexParamsResponse::XEnumHeaderEnum ComplexParamsResponse::XEnumHeaderEnumFro { return XEnumHeaderEnum::Z; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::XEnumHeaderEnum"); } // ========================================= @@ -159,7 +159,7 @@ std::string ComplexParamsResponse::CookieEnumEnumToString(ComplexParamsResponse: case CookieEnumEnum::UNSPECIFIED: return "UNSPECIFIED"; case CookieEnumEnum::COOKIEA: return "cookieA"; case CookieEnumEnum::COOKIEB: return "cookieB"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::CookieEnumEnum"); } } @@ -177,7 +177,7 @@ ComplexParamsResponse::CookieEnumEnum ComplexParamsResponse::CookieEnumEnumFromS { return CookieEnumEnum::COOKIEB; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::CookieEnumEnum"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp index abc0f68723a9..8a52dbc05847 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp @@ -88,7 +88,7 @@ std::string Order::StatusEnumToString(Order::StatusEnum value) case StatusEnum::PLACED: return "placed"; case StatusEnum::APPROVED: return "approved"; case StatusEnum::DELIVERED: return "delivered"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for Order::StatusEnum"); } } @@ -110,7 +110,7 @@ Order::StatusEnum Order::StatusEnumFromString(const std::string& str) { return StatusEnum::DELIVERED; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for Order::StatusEnum"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp index 98a9db80c778..cd68fec0a9d8 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp @@ -88,7 +88,7 @@ std::string Pet::StatusEnumToString(Pet::StatusEnum value) case StatusEnum::AVAILABLE: return "available"; case StatusEnum::PENDING: return "pending"; case StatusEnum::SOLD: return "sold"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for Pet::StatusEnum"); } } @@ -110,7 +110,7 @@ Pet::StatusEnum Pet::StatusEnumFromString(const std::string& str) { return StatusEnum::SOLD; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for Pet::StatusEnum"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp index c4b3db067a46..e61872170d33 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp @@ -106,7 +106,7 @@ std::string User::UserStatusEnumToString(User::UserStatusEnum value) case UserStatusEnum::_0: return "0"; case UserStatusEnum::_1: return "1"; case UserStatusEnum::_2: return "2"; - default: return {}; + default: throw nlohmann::json::type_error::create(302, "Invalid value for User::UserStatusEnum"); } } @@ -128,7 +128,7 @@ User::UserStatusEnum User::UserStatusEnumFromString(const std::string& str) { return UserStatusEnum::_2; } - throw std::invalid_argument("Invalid enum value"); + throw nlohmann::json::type_error::create(302, "Invalid value for User::UserStatusEnum"); } From 112e3e186ccabd1f4213b8f5ceae279b295dab73 Mon Sep 17 00:00:00 2001 From: Stefan Witkowski <131153254+stefanwitkowskiwmb@users.noreply.github.com> Date: Mon, 21 Sep 2026 08:29:33 +0000 Subject: [PATCH 13/13] Revert nlohmann exceptions in cpp, as the corresponding methods are not directly related to nlohmann but are more general in nature. --- .../cpp-httplib-server/model-source.mustache | 4 ++-- .../CppHttplibServerCodegenModelTest.java | 15 ++++++++------- .../feature-test/models/CreditCard.cpp | 4 ++-- .../feature-test/models/EnumTypes.cpp | 12 ++++++------ .../petstore/models/ComplexParamsResponse.cpp | 12 ++++++------ .../cpp-httplib-server/petstore/models/Order.cpp | 4 ++-- .../cpp-httplib-server/petstore/models/Pet.cpp | 4 ++-- .../cpp-httplib-server/petstore/models/User.cpp | 4 ++-- 8 files changed, 30 insertions(+), 29 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache index d693ac5a6bd7..eabdc902a7d8 100644 --- a/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-httplib-server/model-source.mustache @@ -61,7 +61,7 @@ std::string {{classname}}::{{enumName}}ToString({{classname}}::{{enumName}} valu {{#vendorExtensions.enumCases}} case {{enumName}}::{{name}}: return "{{value}}"; {{/vendorExtensions.enumCases}} - default: throw nlohmann::json::type_error::create(302, "Invalid value for {{classname}}::{{enumName}}"); + default: return {}; } } @@ -73,7 +73,7 @@ std::string {{classname}}::{{enumName}}ToString({{classname}}::{{enumName}} valu return {{enumName}}::{{name}}; } {{/vendorExtensions.enumCases}} - throw nlohmann::json::type_error::create(302, "Invalid value for {{classname}}::{{enumName}}"); + throw std::invalid_argument("Invalid enum value"); } {{/isArray}}{{/isEnum}}{{/vars}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java index 329ef6aba0e7..f660a275c7d1 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpphttplibserver/CppHttplibServerCodegenModelTest.java @@ -395,9 +395,9 @@ public void topLevelEnumHeadersRenderTypedJsonValuesTest() throws IOException { } @Test(description = "model-source.mustache's ToString and FromString for an enum property " - + "must both throw nlohmann::json::type_error, naming the enum, on an unrecognised " - + "value -- instead of ToString returning an empty string that hides the error, or " - + "FromString's prior message that didn't name the enum") + + "are plain C++ conversion helpers, not nlohmann (de)serializers, so an unrecognised " + + "value must not throw nlohmann::json::type_error: ToString falls back to an empty " + + "string and FromString throws plain std::invalid_argument") public void propertyEnumConversionRejectsUnknownValuesTest() throws IOException { final File output = Files.createTempDirectory("cpp-httplib-server-prop-enums").toFile(); output.deleteOnExit(); @@ -420,12 +420,13 @@ public void propertyEnumConversionRejectsUnknownValuesTest() throws IOException files.forEach(File::deleteOnExit); // Property enums (de)serialize through StatusEnumToString/StatusEnumFromString rather - // than the switch/if-chain in model-header.mustache's top-level to_json/from_json, so - // they need their own guard against unknown enumerators -- on both directions. + // than the switch/if-chain in model-header.mustache's top-level to_json/from_json, and + // those helpers don't depend on nlohmann::json at all. final Path source = output.toPath().resolve("models/Pet.cpp"); TestUtils.assertFileContains(source, - "default: throw nlohmann::json::type_error::create(302, \"Invalid value for Pet::StatusEnum\");", - "throw nlohmann::json::type_error::create(302, \"Invalid value for Pet::StatusEnum\");"); + "default: return {};", + "throw std::invalid_argument(\"Invalid enum value\");"); + TestUtils.assertFileNotContains(source, "nlohmann::json::type_error::create(302, \"Invalid value for Pet::StatusEnum\")"); } @Test(description = "convert model with nullable property") diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp index cb2e505e727a..ffff74cdb7a0 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/CreditCard.cpp @@ -61,7 +61,7 @@ std::string CreditCard::CardTypeEnumToString(CreditCard::CardTypeEnum value) case CardTypeEnum::VISA: return "visa"; case CardTypeEnum::MASTERCARD: return "mastercard"; case CardTypeEnum::AMEX: return "amex"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for CreditCard::CardTypeEnum"); + default: return {}; } } @@ -83,7 +83,7 @@ CreditCard::CardTypeEnum CreditCard::CardTypeEnumFromString(const std::string& s { return CardTypeEnum::AMEX; } - throw nlohmann::json::type_error::create(302, "Invalid value for CreditCard::CardTypeEnum"); + throw std::invalid_argument("Invalid enum value"); } diff --git a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp index 8f94282d5f0a..20a0ee4f30a7 100644 --- a/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp +++ b/samples/server/petstore/cpp-httplib-server/feature-test/models/EnumTypes.cpp @@ -61,7 +61,7 @@ std::string EnumTypes::StringEnumEnumToString(EnumTypes::StringEnumEnum value) case StringEnumEnum::PENDING: return "pending"; case StringEnumEnum::APPROVED: return "approved"; case StringEnumEnum::REJECTED: return "rejected"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StringEnumEnum"); + default: return {}; } } @@ -83,7 +83,7 @@ EnumTypes::StringEnumEnum EnumTypes::StringEnumEnumFromString(const std::string& { return StringEnumEnum::REJECTED; } - throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StringEnumEnum"); + throw std::invalid_argument("Invalid enum value"); } // ========================================= @@ -99,7 +99,7 @@ std::string EnumTypes::NumericEnumEnumToString(EnumTypes::NumericEnumEnum value) case NumericEnumEnum::_300: return "300"; case NumericEnumEnum::_404: return "404"; case NumericEnumEnum::_500: return "500"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::NumericEnumEnum"); + default: return {}; } } @@ -129,7 +129,7 @@ EnumTypes::NumericEnumEnum EnumTypes::NumericEnumEnumFromString(const std::strin { return NumericEnumEnum::_500; } - throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::NumericEnumEnum"); + throw std::invalid_argument("Invalid enum value"); } // ========================================= @@ -143,7 +143,7 @@ std::string EnumTypes::StatusCodeEnumToString(EnumTypes::StatusCodeEnum value) case StatusCodeEnum::_200: return "200"; case StatusCodeEnum::_404: return "404"; case StatusCodeEnum::_500: return "500"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StatusCodeEnum"); + default: return {}; } } @@ -165,7 +165,7 @@ EnumTypes::StatusCodeEnum EnumTypes::StatusCodeEnumFromString(const std::string& { return StatusCodeEnum::_500; } - throw nlohmann::json::type_error::create(302, "Invalid value for EnumTypes::StatusCodeEnum"); + throw std::invalid_argument("Invalid enum value"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp index 7cde2b31dc69..b8f3c393302d 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/ComplexParamsResponse.cpp @@ -88,7 +88,7 @@ std::string ComplexParamsResponse::EnumParamEnumToString(ComplexParamsResponse:: case EnumParamEnum::A: return "A"; case EnumParamEnum::B: return "B"; case EnumParamEnum::C: return "C"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::EnumParamEnum"); + default: return {}; } } @@ -110,7 +110,7 @@ ComplexParamsResponse::EnumParamEnum ComplexParamsResponse::EnumParamEnumFromStr { return EnumParamEnum::C; } - throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::EnumParamEnum"); + throw std::invalid_argument("Invalid enum value"); } // ========================================= @@ -124,7 +124,7 @@ std::string ComplexParamsResponse::XEnumHeaderEnumToString(ComplexParamsResponse case XEnumHeaderEnum::X: return "X"; case XEnumHeaderEnum::Y: return "Y"; case XEnumHeaderEnum::Z: return "Z"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::XEnumHeaderEnum"); + default: return {}; } } @@ -146,7 +146,7 @@ ComplexParamsResponse::XEnumHeaderEnum ComplexParamsResponse::XEnumHeaderEnumFro { return XEnumHeaderEnum::Z; } - throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::XEnumHeaderEnum"); + throw std::invalid_argument("Invalid enum value"); } // ========================================= @@ -159,7 +159,7 @@ std::string ComplexParamsResponse::CookieEnumEnumToString(ComplexParamsResponse: case CookieEnumEnum::UNSPECIFIED: return "UNSPECIFIED"; case CookieEnumEnum::COOKIEA: return "cookieA"; case CookieEnumEnum::COOKIEB: return "cookieB"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::CookieEnumEnum"); + default: return {}; } } @@ -177,7 +177,7 @@ ComplexParamsResponse::CookieEnumEnum ComplexParamsResponse::CookieEnumEnumFromS { return CookieEnumEnum::COOKIEB; } - throw nlohmann::json::type_error::create(302, "Invalid value for ComplexParamsResponse::CookieEnumEnum"); + throw std::invalid_argument("Invalid enum value"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp index 8a52dbc05847..abc0f68723a9 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Order.cpp @@ -88,7 +88,7 @@ std::string Order::StatusEnumToString(Order::StatusEnum value) case StatusEnum::PLACED: return "placed"; case StatusEnum::APPROVED: return "approved"; case StatusEnum::DELIVERED: return "delivered"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for Order::StatusEnum"); + default: return {}; } } @@ -110,7 +110,7 @@ Order::StatusEnum Order::StatusEnumFromString(const std::string& str) { return StatusEnum::DELIVERED; } - throw nlohmann::json::type_error::create(302, "Invalid value for Order::StatusEnum"); + throw std::invalid_argument("Invalid enum value"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp index cd68fec0a9d8..98a9db80c778 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/Pet.cpp @@ -88,7 +88,7 @@ std::string Pet::StatusEnumToString(Pet::StatusEnum value) case StatusEnum::AVAILABLE: return "available"; case StatusEnum::PENDING: return "pending"; case StatusEnum::SOLD: return "sold"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for Pet::StatusEnum"); + default: return {}; } } @@ -110,7 +110,7 @@ Pet::StatusEnum Pet::StatusEnumFromString(const std::string& str) { return StatusEnum::SOLD; } - throw nlohmann::json::type_error::create(302, "Invalid value for Pet::StatusEnum"); + throw std::invalid_argument("Invalid enum value"); } diff --git a/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp b/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp index e61872170d33..c4b3db067a46 100644 --- a/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp +++ b/samples/server/petstore/cpp-httplib-server/petstore/models/User.cpp @@ -106,7 +106,7 @@ std::string User::UserStatusEnumToString(User::UserStatusEnum value) case UserStatusEnum::_0: return "0"; case UserStatusEnum::_1: return "1"; case UserStatusEnum::_2: return "2"; - default: throw nlohmann::json::type_error::create(302, "Invalid value for User::UserStatusEnum"); + default: return {}; } } @@ -128,7 +128,7 @@ User::UserStatusEnum User::UserStatusEnumFromString(const std::string& str) { return UserStatusEnum::_2; } - throw nlohmann::json::type_error::create(302, "Invalid value for User::UserStatusEnum"); + throw std::invalid_argument("Invalid enum value"); }