Skip to content

Commit 982d149

Browse files
etherealjoyMikailBag
authored andcommitted
Change the Model template (OpenAPITools#5222)
1 parent 9a75b47 commit 982d149

37 files changed

+1773
-1250
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.commons.io.FilenameUtils;
2525
import org.apache.commons.lang3.StringUtils;
2626
import org.openapitools.codegen.CodegenConfig;
27+
import org.openapitools.codegen.CodegenModel;
2728
import org.openapitools.codegen.CodegenProperty;
2829
import org.openapitools.codegen.DefaultCodegen;
2930
import org.openapitools.codegen.templating.mustache.IndentedLambda;
@@ -34,6 +35,7 @@
3435
import java.io.File;
3536
import java.net.URL;
3637
import java.util.Arrays;
38+
import java.util.List;
3739
import java.util.Map;
3840

3941
abstract public class AbstractCppCodegen extends DefaultCodegen implements CodegenConfig {
@@ -327,7 +329,17 @@ public void preprocessOpenAPI(OpenAPI openAPI) {
327329
}
328330

329331
@Override
332+
@SuppressWarnings("unchecked")
330333
public Map<String, Object> postProcessModels(Map<String, Object> objs) {
334+
List<Object> models = (List<Object>) objs.get("models");
335+
for (Object _mo : models) {
336+
Map<String, Object> mo = (Map<String, Object>) _mo;
337+
CodegenModel cm = (CodegenModel) mo.get("model");
338+
// cannot handle inheritance from maps and arrays in C++
339+
if((cm.isArrayModel || cm.isMapModel ) && (cm.parentModel == null)) {
340+
cm.parent = null;
341+
}
342+
}
331343
return postProcessModelsEnum(objs);
332344
}
333345
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public CppRestSdkClientCodegen() {
169169
typeMapping.put("map", "std::map");
170170
typeMapping.put("file", "HttpContent");
171171
typeMapping.put("object", "Object");
172-
typeMapping.put("binary", "utility::string_t");
172+
typeMapping.put("binary", "HttpContent");
173173
typeMapping.put("number", "double");
174174
typeMapping.put("UUID", "utility::string_t");
175175
typeMapping.put("URI", "utility::string_t");
@@ -348,6 +348,8 @@ public String getTypeDeclaration(Schema p) {
348348
} else if (ModelUtils.isMapSchema(p)) {
349349
Schema inner = ModelUtils.getAdditionalProperties(p);
350350
return getSchemaType(p) + "<utility::string_t, " + getTypeDeclaration(inner) + ">";
351+
} else if (ModelUtils.isFileSchema(p) || ModelUtils.isBinarySchema(p)) {
352+
return "std::shared_ptr<" + openAPIType + ">";
351353
} else if (ModelUtils.isStringSchema(p)
352354
|| ModelUtils.isDateSchema(p) || ModelUtils.isDateTimeSchema(p)
353355
|| ModelUtils.isFileSchema(p) || ModelUtils.isUUIDSchema(p)
@@ -403,9 +405,10 @@ public void postProcessParameter(CodegenParameter parameter) {
403405

404406
boolean isPrimitiveType = parameter.isPrimitiveType == Boolean.TRUE;
405407
boolean isListContainer = parameter.isListContainer == Boolean.TRUE;
408+
boolean isMapContainer = parameter.isMapContainer == Boolean.TRUE;
406409
boolean isString = parameter.isString == Boolean.TRUE;
407410

408-
if (!isPrimitiveType && !isListContainer && !isString && !parameter.dataType.startsWith("std::shared_ptr")) {
411+
if (!isPrimitiveType && !isListContainer && !isMapContainer && !isString && !parameter.dataType.startsWith("std::shared_ptr")) {
409412
parameter.dataType = "std::shared_ptr<" + parameter.dataType + ">";
410413
}
411414
}

modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/README.mustache

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ make
4444
- Once visual studio opens, CMake should show up in top menu bar.
4545
- Select CMake > Build All.
4646

47-
*Note: If the CMake menu item doesn't show up in Visual Studio, CMake
48-
for Visual Studio must be installed. In this case, open the 'Visual Studio
49-
Installer' application. Select 'modify' Visual Studio 2017. Make sure
50-
'Desktop Development with C++' is installed, and specifically that 'Visual
47+
*Note: If the CMake menu item doesn't show up in Visual Studio, CMake
48+
for Visual Studio must be installed. In this case, open the 'Visual Studio
49+
Installer' application. Select 'modify' Visual Studio 2017. Make sure
50+
'Desktop Development with C++' is installed, and specifically that 'Visual
5151
C++ tools for CMake' is selected in the 'Installation Details' section.
5252

5353
Also be sure to review the CMakeLists.txt file. Edits are likely required.*

modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/api-header.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public:
3333
{{#operation}}
3434
virtual pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{operationId}}(
3535
{{#allParams}}
36-
{{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
36+
{{^required}}boost::optional<{{/required}}{{{dataType}}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
3737
{{/allParams}}
3838
) const = 0;
3939
{{/operation}}
@@ -67,7 +67,7 @@ public:
6767
{{/allParams}}
6868
pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{operationId}}(
6969
{{#allParams}}
70-
{{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
70+
{{^required}}boost::optional<{{/required}}{{{dataType}}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}},{{/hasMore}}
7171
{{/allParams}}
7272
) const{{#gmockApis}} override{{/gmockApis}};
7373
{{/operation}}

modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/api-source.mustache

Lines changed: 30 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ using namespace {{modelNamespace}};
2626
}
2727

2828
{{#operation}}
29-
pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{classname}}::{{operationId}}({{#allParams}}{{^required}}boost::optional<{{/required}}{{#isFile}}std::shared_ptr<{{/isFile}}{{{dataType}}}{{#isFile}}>{{/isFile}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) const
29+
pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{classname}}::{{operationId}}({{#allParams}}{{^required}}boost::optional<{{/required}}{{{dataType}}}{{^required}}>{{/required}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) const
3030
{
3131
{{#allParams}}{{#required}}{{^isPrimitiveType}}{{^isContainer}}
3232
// verify the required parameter '{{paramName}}' is set
@@ -160,13 +160,13 @@ pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/r
160160
web::json::value localVarJson;
161161
162162
{{#isPrimitiveType}}
163-
localVarJson = ModelBase::toJson({{paramName}});
163+
localVarJson = ModelBase::toJson({{paramName}}{{^required}}.get(){{/required}});
164164
{{/isPrimitiveType}}
165165
{{^isPrimitiveType}}
166166
{{#isListContainer}}
167167
{
168168
std::vector<web::json::value> localVarJsonArray;
169-
for( auto& localVarItem : {{paramName}} )
169+
for( auto& localVarItem : {{paramName}}{{^required}}.get(){{/required}} )
170170
{
171171
{{#items.isPrimitiveType}}localVarJsonArray.push_back(ModelBase::toJson(localVarItem));
172172
{{/items.isPrimitiveType}}{{^items.isPrimitiveType}}{{#items.isString}}localVarJsonArray.push_back(ModelBase::toJson(localVarItem));
@@ -193,30 +193,32 @@ pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/r
193193
{{#bodyParam}}
194194
std::shared_ptr<MultipartFormData> localVarMultipart(new MultipartFormData);
195195
{{#isPrimitiveType}}
196-
localVarMultipart->add(ModelBase::toHttpContent(utility::conversions::to_string_t("{{paramName}}"), {{paramName}}));
197-
{{/isPrimitiveType}}
198-
{{^isPrimitiveType}}
199-
{{#isListContainer}}
196+
localVarMultipart->add(ModelBase::toHttpContent(utility::conversions::to_string_t("{{paramName}}"), {{paramName}}{{^required}}.get(){{/required}}));
197+
{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isListContainer}}
200198
{
201199
std::vector<web::json::value> localVarJsonArray;
202-
for( auto& localVarItem : {{paramName}} )
200+
for( auto& localVarItem : {{paramName}}{{^required}}.get(){{/required}} )
203201
{
204-
{{#items.isPrimitiveType}}localVarJsonArray.push_back(ModelBase::toJson(localVarItem));
205-
{{/items.isPrimitiveType}}{{^items.isPrimitiveType}}{{#items.isString}}localVarJsonArray.push_back(ModelBase::toJson(localVarItem));
206-
{{/items.isString}}{{^items.isString}}{{#items.isDateTime}}localVarJsonArray.push_back(ModelBase::toJson(localVarItem));
207-
{{/items.isDateTime}}{{^items.isDateTime}}localVarJsonArray.push_back( localVarItem.get() ? localVarItem->toJson() : web::json::value::null() );
208-
{{/items.isDateTime}}{{/items.isString}}{{/items.isPrimitiveType}}
202+
localVarJsonArray.push_back(ModelBase::toJson(localVarItem));
209203
}
210-
localVarMultipart->add(ModelBase::toHttpContent(utility::conversions::to_string_t("{{paramName}}"), web::json::value::array(localVarJsonArray), utility::conversions::to_string_t("application/json")));
211-
}{{/isListContainer}}
212-
{{^isListContainer}}{{#isString}}localVarMultipart->add(ModelBase::toHttpContent(utility::conversions::to_string_t("{{paramName}}"), {{paramName}}));
204+
localVarMultipart->add(ModelBase::toHttpContent(utility::conversions::to_string_t("{{paramName}}"), localVarJsonArray, utility::conversions::to_string_t("application/json")));
205+
}{{/isListContainer}}{{#isMapContainer}}
206+
{
207+
std::map<utility::string_t, web::json::value> localVarJsonMap;
208+
for( auto& localVarItem : {{paramName}}{{^required}}.get(){{/required}} )
209+
{
210+
web::json::value jval;
211+
localVarJsonMap.insert( std::pair<utility::string_t, web::json::value>(localVarItem.first, ModelBase::toJson(localVarItem.second) ));
212+
}
213+
localVarMultipart->add(ModelBase::toHttpContent(utility::conversions::to_string_t("{{paramName}}"), localVarJsonMap, utility::conversions::to_string_t("application/json")));
214+
}{{/isMapContainer}}
215+
{{^isListContainer}}{{^isMapContainer}}{{#isString}}localVarMultipart->add(ModelBase::toHttpContent(utility::conversions::to_string_t("{{paramName}}"), {{paramName}}));
213216
{{/isString}}{{^isString}}if({{^required}}{{paramName}} && (*{{paramName}}){{/required}}{{#required}}{{paramName}}{{/required}}.get())
214217
{
215218
{{^required}}(*{{/required}}{{paramName}}{{^required}}){{/required}}->toMultipart(localVarMultipart, utility::conversions::to_string_t("{{paramName}}"));
216219
}
217220
{{/isString}}
218-
{{/isListContainer}}
219-
{{/isPrimitiveType}}
221+
{{/isMapContainer}}{{/isListContainer}}{{/isPrimitiveType}}
220222
221223
localVarHttpBody = localVarMultipart;
222224
localVarRequestHttpContentType += utility::conversions::to_string_t("; boundary=") + localVarMultipart->getBoundary();
@@ -318,29 +320,20 @@ pplx::task<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/r
318320
if(localVarResponseHttpContentType == utility::conversions::to_string_t("application/json"))
319321
{
320322
web::json::value localVarJson = web::json::value::parse(localVarResponse);
321-
322-
{{#isListContainer}}for( auto& localVarItem : localVarJson.as_array() )
323+
{{#isListContainer}}
324+
for( auto& localVarItem : localVarJson.as_array() )
323325
{
324-
{{#vendorExtensions.x-codegen-response.items.isPrimitiveType}}localVarResult.push_back(ModelBase::{{vendorExtensions.x-codegen-response.items.datatype}}FromJson(localVarItem));
325-
{{/vendorExtensions.x-codegen-response.items.isPrimitiveType}}{{^vendorExtensions.x-codegen-response.items.isPrimitiveType}}{{#vendorExtensions.x-codegen-response.items.isString}}localVarResult.push_back(ModelBase::stringFromJson(localVarItem));
326-
{{/vendorExtensions.x-codegen-response.items.isString}}{{^vendorExtensions.x-codegen-response.items.isString}}{{{vendorExtensions.x-codegen-response.items.datatype}}} localVarItemObj({{{vendorExtensions.x-codegen-response.items.defaultValue}}});
327-
localVarItemObj->fromJson(localVarItem);
326+
{{{vendorExtensions.x-codegen-response.items.datatype}}} localVarItemObj;
327+
ModelBase::fromJson(localVarItem, localVarItemObj);
328328
localVarResult.push_back(localVarItemObj);
329-
{{/vendorExtensions.x-codegen-response.items.isString}}{{/vendorExtensions.x-codegen-response.items.isPrimitiveType}}
330-
}
331-
{{/isListContainer}}{{^isListContainer}}{{#isMapContainer}}for( auto& localVarItem : localVarJson.as_object() )
329+
}{{/isListContainer}}{{#isMapContainer}}
330+
for( auto& localVarItem : localVarJson.as_object() )
332331
{
333-
{{#vendorExtensions.x-codegen-response.items.isPrimitiveType}}localVarResult[localVarItem.first] = ModelBase::{{vendorExtensions.x-codegen-response.items.datatype}}FromJson(localVarItem.second);
334-
{{/vendorExtensions.x-codegen-response.items.isPrimitiveType}}{{^vendorExtensions.x-codegen-response.items.isPrimitiveType}}{{#vendorExtensions.x-codegen-response.items.isString}}localVarResult[localVarItem.first] = ModelBase::stringFromJson(localVarItem.second);
335-
{{/vendorExtensions.x-codegen-response.items.isString}}{{^vendorExtensions.x-codegen-response.items.isString}}{{{vendorExtensions.x-codegen-response.items.datatype}}} localVarItemObj({{{vendorExtensions.x-codegen-response.items.defaultValue}}});
336-
localVarItemObj->fromJson(localVarItem.second);
332+
{{{vendorExtensions.x-codegen-response.items.datatype}}} localVarItemObj;
333+
ModelBase::fromJson(localVarItem.second, localVarItemObj);
337334
localVarResult[localVarItem.first] = localVarItemObj;
338-
{{/vendorExtensions.x-codegen-response.items.isString}}{{/vendorExtensions.x-codegen-response.items.isPrimitiveType}}
339-
}
340-
{{/isMapContainer}}{{^isMapContainer}}{{#vendorExtensions.x-codegen-response.isPrimitiveType}}{{#vendorExtensions.x-codegen-response.items.datatype}}localVarResult = ModelBase::{{vendorExtensions.x-codegen-response.items.datatype}}FromJson(localVarJson);
341-
{{/vendorExtensions.x-codegen-response.items.datatype}}{{^vendorExtensions.x-codegen-response.items.datatype}}localVarResult = ModelBase::{{vendorExtensions.x-codegen-response.datatype}}FromJson(localVarJson);
342-
{{/vendorExtensions.x-codegen-response.items.datatype}}{{/vendorExtensions.x-codegen-response.isPrimitiveType}}{{^vendorExtensions.x-codegen-response.isPrimitiveType}}{{#vendorExtensions.x-codegen-response.isString}}localVarResult = ModelBase::stringFromJson(localVarJson);
343-
{{/vendorExtensions.x-codegen-response.isString}}{{^vendorExtensions.x-codegen-response.isString}}localVarResult->fromJson(localVarJson);{{/vendorExtensions.x-codegen-response.isString}}{{/vendorExtensions.x-codegen-response.isPrimitiveType}}{{/isMapContainer}}{{/isListContainer}}
335+
}{{/isMapContainer}}{{^isListContainer}}{{^isMapContainer}}
336+
ModelBase::fromJson(localVarJson, localVarResult);{{/isMapContainer}}{{/isListContainer}}
344337
}{{#vendorExtensions.x-codegen-response.isString}}
345338
else if(localVarResponseHttpContentType == utility::conversions::to_string_t("text/plain"))
346339
{

modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/httpcontent-header.mustache

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@ public:
2424
HttpContent();
2525
virtual ~HttpContent();
2626
27-
virtual utility::string_t getContentDisposition();
27+
virtual utility::string_t getContentDisposition() const;
2828
virtual void setContentDisposition( const utility::string_t& value );
2929
30-
virtual utility::string_t getName();
30+
virtual utility::string_t getName() const;
3131
virtual void setName( const utility::string_t& value );
3232
33-
virtual utility::string_t getFileName();
33+
virtual utility::string_t getFileName() const;
3434
virtual void setFileName( const utility::string_t& value );
3535
36-
virtual utility::string_t getContentType();
36+
virtual utility::string_t getContentType() const;
3737
virtual void setContentType( const utility::string_t& value );
3838
39-
virtual std::shared_ptr<std::istream> getData();
39+
virtual std::shared_ptr<std::istream> getData() const;
4040
virtual void setData( std::shared_ptr<std::istream> value );
4141
4242
virtual void writeTo( std::ostream& stream );

modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/httpcontent-source.mustache

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ HttpContent::~HttpContent()
1313
{
1414
}
1515

16-
utility::string_t HttpContent::getContentDisposition()
16+
utility::string_t HttpContent::getContentDisposition() const
1717
{
1818
return m_ContentDisposition;
1919
}
@@ -23,7 +23,7 @@ void HttpContent::setContentDisposition( const utility::string_t & value )
2323
m_ContentDisposition = value;
2424
}
2525

26-
utility::string_t HttpContent::getName()
26+
utility::string_t HttpContent::getName() const
2727
{
2828
return m_Name;
2929
}
@@ -33,7 +33,7 @@ void HttpContent::setName( const utility::string_t & value )
3333
m_Name = value;
3434
}
3535

36-
utility::string_t HttpContent::getFileName()
36+
utility::string_t HttpContent::getFileName() const
3737
{
3838
return m_FileName;
3939
}
@@ -43,7 +43,7 @@ void HttpContent::setFileName( const utility::string_t & value )
4343
m_FileName = value;
4444
}
4545

46-
utility::string_t HttpContent::getContentType()
46+
utility::string_t HttpContent::getContentType() const
4747
{
4848
return m_ContentType;
4949
}
@@ -53,7 +53,7 @@ void HttpContent::setContentType( const utility::string_t & value )
5353
m_ContentType = value;
5454
}
5555

56-
std::shared_ptr<std::istream> HttpContent::getData()
56+
std::shared_ptr<std::istream> HttpContent::getData() const
5757
{
5858
return m_Data;
5959
}

modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/model-header.mustache

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ public:
3434
void validate() override;
3535

3636
web::json::value toJson() const override;
37-
void fromJson(const web::json::value& json) override;
37+
bool fromJson(const web::json::value& json) override;
3838

3939
void toMultipart(std::shared_ptr<MultipartFormData> multipart, const utility::string_t& namePrefix) const override;
40-
void fromMultiPart(std::shared_ptr<MultipartFormData> multipart, const utility::string_t& namePrefix) override;
40+
bool fromMultiPart(std::shared_ptr<MultipartFormData> multipart, const utility::string_t& namePrefix) override;
4141

42-
enum class e{{classname}}
42+
enum class e{{classname}}
4343
{
4444
{{#allowableValues}}
4545
{{#enumVars}}
@@ -48,8 +48,8 @@ public:
4848
/// {{enumDescription}}
4949
/// </summary>
5050
{{/enumDescription}}
51-
{{classname}}_{{{name}}}{{^last}},{{/last}}
52-
{{/enumVars}}
51+
{{classname}}_{{{name}}}{{^last}},{{/last}}
52+
{{/enumVars}}
5353
{{/allowableValues}}
5454
};
5555

@@ -78,10 +78,10 @@ public:
7878
void validate() override;
7979

8080
web::json::value toJson() const override;
81-
void fromJson(const web::json::value& json) override;
81+
bool fromJson(const web::json::value& json) override;
8282

8383
void toMultipart(std::shared_ptr<MultipartFormData> multipart, const utility::string_t& namePrefix) const override;
84-
void fromMultiPart(std::shared_ptr<MultipartFormData> multipart, const utility::string_t& namePrefix) override;
84+
bool fromMultiPart(std::shared_ptr<MultipartFormData> multipart, const utility::string_t& namePrefix) override;
8585

8686
/////////////////////////////////////////////
8787
/// {{classname}} members
@@ -93,9 +93,8 @@ public:
9393
/// </summary>
9494
{{#isContainer}}{{{dataType}}}& {{getter}}();
9595
{{/isContainer}}{{^isContainer}}{{{dataType}}} {{getter}}() const;
96-
{{/isContainer}}{{^required}}bool {{nameInCamelCase}}IsSet() const;
96+
{{/isContainer}}bool {{nameInCamelCase}}IsSet() const;
9797
void unset{{name}}();
98-
{{/required}}
9998

10099
{{#isPrimitiveType}}
101100
void {{setter}}({{{dataType}}} value);
@@ -111,8 +110,7 @@ protected:
111110
{{#vars}}
112111
{{^isInherited}}
113112
{{{dataType}}} m_{{name}};
114-
{{^required}}bool m_{{name}}IsSet;
115-
{{/required}}
113+
bool m_{{name}}IsSet;
116114
{{/isInherited}}
117115
{{/vars}}
118116
};

0 commit comments

Comments
 (0)