Skip to content

Commit 89eb603

Browse files
SalDiAngelusetherealjoy
authored andcommitted
[C++][Pistache] Fixed #2643 (#2653)
* Fixed #2643 Refactored to/from json functions to use universal object serialization method. * Code review found incorrect indenting and I forgot to remove unused mustache files. * Removed helpers class because it is not needed anymore. * Removed helpers package from docs. * Reverted helper class removal.
1 parent cce35d7 commit 89eb603

37 files changed

+269
-935
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ public CppPistacheServerCodegen() {
8181

8282
reservedWords = new HashSet<>();
8383

84-
supportingFiles.add(new SupportingFile("modelbase-header.mustache", "model", modelNamePrefix + "ModelBase.h"));
85-
supportingFiles.add(new SupportingFile("modelbase-source.mustache", "model", modelNamePrefix + "ModelBase.cpp"));
8684
supportingFiles.add(new SupportingFile("helpers-header.mustache", "model", modelNamePrefix + "Helpers.h"));
8785
supportingFiles.add(new SupportingFile("helpers-source.mustache", "model", modelNamePrefix + "Helpers.cpp"));
8886
supportingFiles.add(new SupportingFile("main-api-server.mustache", "", modelNamePrefix + "main-api-server.cpp"));
@@ -124,8 +122,6 @@ public void processOpts() {
124122
if (additionalProperties.containsKey("modelNamePrefix")) {
125123
additionalProperties().put("prefix", modelNamePrefix);
126124
supportingFiles.clear();
127-
supportingFiles.add(new SupportingFile("modelbase-header.mustache", "model", modelNamePrefix + "ModelBase.h"));
128-
supportingFiles.add(new SupportingFile("modelbase-source.mustache", "model", modelNamePrefix + "ModelBase.cpp"));
129125
supportingFiles.add(new SupportingFile("helpers-header.mustache", "model", modelNamePrefix + "Helpers.h"));
130126
supportingFiles.add(new SupportingFile("helpers-source.mustache", "model", modelNamePrefix + "Helpers.cpp"));
131127
supportingFiles.add(new SupportingFile("main-api-server.mustache", "", modelNamePrefix + "main-api-server.cpp"));

modules/openapi-generator/src/main/resources/cpp-pistache-server/README.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ cd build
4141
## Libraries required
4242
- [pistache](http://pistache.io/quickstart)
4343
- [JSON for Modern C++](https://github.com/nlohmann/json/#integration): Please download the `json.hpp` file and
44-
put it under the model folder
44+
put it under the model/nlohmann folder
4545

4646
## Namespaces
4747
{{{apiPackage}}}

modules/openapi-generator/src/main/resources/cpp-pistache-server/api-source.mustache

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,7 @@ void {{classname}}::{{operationIdSnakeCase}}_handler(const Pistache::Rest::Reque
7070
try {
7171
{{#hasBodyParam}}
7272
{{#bodyParam}}
73-
nlohmann::json request_body = nlohmann::json::parse(request.body());
74-
{{^isPrimitiveType}}{{^isContainer}}
75-
{{paramName}}.fromJson(request_body);
76-
{{/isContainer}}{{/isPrimitiveType}}{{#isContainer}} {{paramName}} = {{#isListContainer}} {{prefix}}ArrayHelper{{/isListContainer}}{{#isMapContainer}} {{prefix}}MapHelper{{/isMapContainer}}::fromJson<{{items.baseType}}>(request_body);{{/isContainer}}
77-
{{#isPrimitiveType}}
78-
// The conversion is done automatically by the json library
79-
{{paramName}} = request_body;
80-
{{/isPrimitiveType}}
73+
nlohmann::json::parse(request.body()).get_to({{paramName}});
8174
{{/bodyParam}}
8275
{{/hasBodyParam}}
8376
this->{{operationIdSnakeCase}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}response);

modules/openapi-generator/src/main/resources/cpp-pistache-server/cmake.mustache

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ ExternalProject_Add(NLOHMANN
2020

2121
)
2222
include_directories(${EXTERNAL_INSTALL_LOCATION}/include)
23-
include_directories(${EXTERNAL_INSTALL_LOCATION}/include/nlohmann)
2423
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
2524
{{/addExternalLibs}}
2625

modules/openapi-generator/src/main/resources/cpp-pistache-server/model-header.mustache

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@
99
#define {{classname}}_H_
1010

1111
{{{defaultInclude}}}
12-
#include "{{prefix}}ModelBase.h"
13-
1412
{{#imports}}{{{this}}}
1513
{{/imports}}
14+
#include <nlohmann/json.hpp>
1615

1716
{{#modelNamespaceDeclarations}}
1817
namespace {{this}} {
@@ -22,19 +21,12 @@ namespace {{this}} {
2221
/// {{description}}
2322
/// </summary>
2423
class {{declspec}} {{classname}}
25-
: public {{prefix}}ModelBase
2624
{
2725
public:
2826
{{classname}}();
2927
virtual ~{{classname}}();
3028

31-
/////////////////////////////////////////////
32-
/// {{prefix}}ModelBase overrides
33-
34-
void validate() override;
35-
36-
nlohmann::json toJson() const override;
37-
void fromJson(const nlohmann::json& json) override;
29+
void validate();
3830

3931
/////////////////////////////////////////////
4032
/// {{classname}} members
@@ -51,6 +43,8 @@ public:
5143
{{/required}}
5244
{{/vars}}
5345

46+
friend void to_json(nlohmann::json& j, const {{classname}}& o);
47+
friend void from_json(const nlohmann::json& j, {{classname}}& o);
5448
protected:
5549
{{#vars}}
5650
{{{dataType}}} m_{{name}};

modules/openapi-generator/src/main/resources/cpp-pistache-server/model-source.mustache

Lines changed: 13 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -25,126 +25,26 @@ void {{classname}}::validate()
2525
// TODO: implement validation
2626
}
2727

28-
nlohmann::json {{classname}}::toJson() const
28+
void to_json(nlohmann::json& j, const {{classname}}& o)
2929
{
30-
nlohmann::json val = nlohmann::json::object();
31-
32-
{{#vars}}{{#isPrimitiveType}}{{^isListContainer}}{{^required}}if(m_{{name}}IsSet)
33-
{
34-
val["{{baseName}}"] = m_{{name}};
35-
}
36-
{{/required}}{{#required}}val["{{baseName}}"] = m_{{name}};
37-
{{/required}}{{/isListContainer}}{{/isPrimitiveType}}{{#isListContainer}}{
38-
nlohmann::json jsonArray;
39-
for( const auto& item : m_{{name}} )
40-
{
41-
jsonArray.push_back({{prefix}}ModelBase::toJson(item));
42-
}
43-
{{#required}}val["{{baseName}}"] = jsonArray;
44-
{{/required}}{{^required}}
45-
if(jsonArray.size() > 0)
46-
{
47-
val["{{baseName}}"] = jsonArray;
48-
} {{/required}}
49-
}
50-
{{/isListContainer}}{{#isMapContainer}}{
51-
nlohmann::json jsonObj;
52-
for( const auto& item : m_{{name}} )
53-
{ {{^items.isContainer}}
54-
jsonObj[item.first] = {{prefix}}ModelBase::toJson(item.second);{{/items.isContainer}} {{#items.isListContainer}}
55-
jsonObj[item.first] = {{prefix}}ArrayHelper::toJson<{{{items.items.datatype}}}>(item.second);
56-
{{/items.isListContainer}} {{#items.isMapContainer}}
57-
jsonObj[item.first] = {{prefix}}MapHelper::toJson<{{{items.items.datatype}}}>(item.second); {{/items.isMapContainer}}
58-
}
59-
{{#required}}val["{{baseName}}"] = jsonObj; {{/required}}{{^required}}
60-
if(jsonObj.size() > 0)
61-
{
62-
val["{{baseName}}"] = jsonObj;
63-
} {{/required}}
64-
}
65-
{{/isMapContainer}}{{^isContainer}}{{^isPrimitiveType}}{{^required}}if(m_{{name}}IsSet)
66-
{
67-
val["{{baseName}}"] = {{prefix}}ModelBase::toJson(m_{{name}});
68-
}
69-
{{/required}}{{#required}}val["{{baseName}}"] = {{prefix}}ModelBase::toJson(m_{{name}});
70-
{{/required}}{{/isPrimitiveType}}{{/isContainer}}{{/vars}}
71-
72-
return val;
30+
j = nlohmann::json();
31+
{{#vars}}
32+
{{#required}}j["{{baseName}}"] = o.m_{{name}};{{/required}}{{^required}}if(o.{{nameInCamelCase}}IsSet())
33+
j["{{baseName}}"] = o.m_{{name}};{{/required}}
34+
{{/vars}}
7335
}
7436

75-
void {{classname}}::fromJson(const nlohmann::json& val)
37+
void from_json(const nlohmann::json& j, {{classname}}& o)
7638
{
77-
{{#vars}}{{#isPrimitiveType}}{{^isListContainer}}{{^required}}if(val.find("{{baseName}}") != val.end())
78-
{
79-
{{setter}}(val.at("{{baseName}}"));
80-
}
81-
{{/required}}{{#required}}{{setter}}(val.at("{{baseName}}"));
82-
{{/required}}{{/isListContainer}}{{/isPrimitiveType}}{{#isListContainer}}{
83-
m_{{name}}.clear();
84-
{{^required}}if(val.find("{{baseName}}") != val.end())
85-
{
86-
{{/required}}
87-
for( const auto& item : val["{{baseName}}"] )
88-
{
89-
{{#isPrimitiveType}}m_{{name}}.push_back(item);
90-
{{/isPrimitiveType}}{{^isPrimitiveType}}{{#items.isString}}m_{{name}}.push_back(item);
91-
{{/items.isString}}{{^items.isString}}{{#items.isDateTime}}m_{{name}}.push_back(item);
92-
{{/items.isDateTime}}{{^items.isDateTime}}
93-
if(item.is_null())
94-
{
95-
m_{{name}}.push_back( {{{items.datatype}}}() );
96-
}
97-
else
98-
{
99-
{{{items.datatype}}} newItem;
100-
newItem.fromJson(item);
101-
m_{{name}}.push_back( newItem );
102-
}
103-
{{/items.isDateTime}}{{/items.isString}}{{/isPrimitiveType}}
104-
}
105-
{{^required}}
106-
}
107-
{{/required}}
108-
}
109-
{{/isListContainer}}{{#isMapContainer}}{
110-
m_{{name}}.clear();
111-
{{^required}}if(val.find("{{baseName}}") != val.end())
112-
{
113-
{{/required}}
114-
if(val["{{baseName}}"].is_object()) { {{^items.isContainer}}
115-
m_{{name}} = {{prefix}}MapHelper::fromJson<{{{items.datatype}}}>(val["{{baseName}}"]);
116-
{{/items.isContainer}} {{#items.isContainer}}
117-
for( const auto& item : val["{{baseName}}"].items() )
118-
{ {{#items.isMapContainer}}
119-
{{{items.datatype}}} newItem = {{prefix}}MapHelper::fromJson<{{{items.items.datatype}}}>(item.value());
120-
{{/items.isMapContainer}}{{#items.isListContainer}}
121-
{{{items.datatype}}} newItem = {{prefix}}ArrayHelper::fromJson<{{{items.items.datatype}}}>(item.value());
122-
{{/items.isListContainer}}
123-
m_{{name}}.insert(m_{{name}}.end(), std::pair< std::string, {{{items.datatype}}} >(item.key(), newItem));
124-
} {{/items.isContainer}}
125-
}
126-
{{^required}}
127-
}
128-
{{/required}}
129-
}
130-
{{/isMapContainer}}{{^isContainer}}{{^isPrimitiveType}}{{^required}}if(val.find("{{baseName}}") != val.end())
39+
{{#vars}}
40+
{{#required}}j.at("{{baseName}}").get_to(o.m_{{name}});{{/required}}{{^required}}if(!j.at("{{baseName}}").is_null())
13141
{
132-
{{#isString}}{{setter}}(val.at("{{baseName}}"));{{/isString}}{{#isByteArray}}{{setter}}(val.at("{{baseName}}"));{{/isByteArray}}{{#isBinary}}{{setter}}(val.at("{{baseName}}"));
133-
{{/isBinary}}{{^isString}}{{#isDateTime}}{{setter}}(val.at("{{baseName}}"));
134-
{{/isDateTime}}{{^isDateTime}}{{^isByteArray}}{{^isBinary}}if(!val["{{baseName}}"].is_null())
135-
{
136-
{{{dataType}}} newItem;
137-
newItem.fromJson(val["{{baseName}}"]);
138-
{{setter}}( newItem );
139-
}
140-
{{/isBinary}}{{/isByteArray}}{{/isDateTime}}{{/isString}}
141-
}
142-
{{/required}}{{#required}}{{#isString}}{{setter}}(val.at("{{baseName}}"));
143-
{{/isString}}{{^isString}}{{#isDateTime}}{{setter}}(val.at("{{baseName}}"));
144-
{{/isDateTime}}{{/isString}}{{/required}}{{/isPrimitiveType}}{{/isContainer}}{{/vars}}
42+
j.at("{{baseName}}").get_to(o.m_{{name}});
43+
o.m_{{name}}IsSet = true;
44+
} {{/required}}
45+
{{/vars}}
14546
}
14647

147-
14848
{{#vars}}{{#isContainer}}{{{dataType}}}& {{classname}}::{{getter}}()
14949
{
15050
return m_{{name}};

modules/openapi-generator/src/main/resources/cpp-pistache-server/modelbase-header.mustache

Lines changed: 0 additions & 127 deletions
This file was deleted.

0 commit comments

Comments
 (0)