Skip to content

Commit 79de37d

Browse files
committed
( cpp-httplib-server ) Fix for Path params and inline enum generation
1 parent fd35824 commit 79de37d

25 files changed

Lines changed: 2052 additions & 757 deletions

File tree

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

Lines changed: 223 additions & 25 deletions
Large diffs are not rendered by default.

modules/openapi-generator/src/main/resources/cpp-httplib-server/api-header.mustache

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,35 @@ public:
4444
*/
4545
struct {{requestType}}
4646
{
47+
{{#queryParams}}{{#vendorExtensions.isEnum}}{{^vendorExtensions.isArray}}
48+
enum class {{vendorExtensions.shortEnumName}} {
49+
{{#vendorExtensions.values}}{{.}}{{^-last}},
50+
{{/-last}}{{/vendorExtensions.values}}
51+
};
52+
static std::string {{vendorExtensions.enumToStringHelper}}({{vendorExtensions.shortEnumName}} value);
53+
static {{vendorExtensions.shortEnumName}} {{vendorExtensions.enumFromStringHelper}}(const std::string& str);
54+
{{/vendorExtensions.isArray}}{{/vendorExtensions.isEnum}}{{/queryParams}}{{#headerParams}}{{#vendorExtensions.isEnum}}{{^vendorExtensions.isArray}}
55+
enum class {{vendorExtensions.shortEnumName}} {
56+
{{#vendorExtensions.values}}{{.}}{{^-last}},
57+
{{/-last}}{{/vendorExtensions.values}}
58+
};
59+
static std::string {{vendorExtensions.enumToStringHelper}}({{vendorExtensions.shortEnumName}} value);
60+
static {{vendorExtensions.shortEnumName}} {{vendorExtensions.enumFromStringHelper}}(const std::string& str);
61+
{{/vendorExtensions.isArray}}{{/vendorExtensions.isEnum}}{{/headerParams}}{{#pathParams}}{{#vendorExtensions.isEnum}}{{^vendorExtensions.isArray}}
62+
enum class {{vendorExtensions.shortEnumName}} {
63+
{{#vendorExtensions.values}}{{.}}{{^-last}},
64+
{{/-last}}{{/vendorExtensions.values}}
65+
};
66+
static std::string {{vendorExtensions.enumToStringHelper}}({{vendorExtensions.shortEnumName}} value);
67+
static {{vendorExtensions.shortEnumName}} {{vendorExtensions.enumFromStringHelper}}(const std::string& str);
68+
{{/vendorExtensions.isArray}}{{/vendorExtensions.isEnum}}{{/pathParams}}{{#cookieParams}}{{#vendorExtensions.isEnum}}{{^vendorExtensions.isArray}}
69+
enum class {{vendorExtensions.shortEnumName}} {
70+
{{#vendorExtensions.values}}{{.}}{{^-last}},
71+
{{/-last}}{{/vendorExtensions.values}}
72+
};
73+
static std::string {{vendorExtensions.enumToStringHelper}}({{vendorExtensions.shortEnumName}} value);
74+
static {{vendorExtensions.shortEnumName}} {{vendorExtensions.enumFromStringHelper}}(const std::string& str);
75+
{{/vendorExtensions.isArray}}{{/vendorExtensions.isEnum}}{{/cookieParams}}
4776
{{#requestModel}}
4877
{{{bodyParam.dataType}}} m_request; //Request Body{{#bodyParam.vendorExtensions.isRequired}} (required){{/bodyParam.vendorExtensions.isRequired}}{{^bodyParam.vendorExtensions.isRequired}} (optional){{/bodyParam.vendorExtensions.isRequired}}{{/requestModel}}{{#queryParams}}
4978
{{{dataType}}} m_{{paramName}}; //Query Params{{#vendorExtensions.isRequired}} (required){{/vendorExtensions.isRequired}}{{^vendorExtensions.isRequired}} (optional){{/vendorExtensions.isRequired}}{{/queryParams}}{{#headerParams}}

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

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,7 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
5050
errors.push_back("Missing required request body");
5151
}{{/bodyParam.vendorExtensions.isRequired}}
5252
{{/requestModel}}
53-
{{#queryParams}}
54-
{{#-first}}
55-
56-
{{/-first}}
53+
{{#queryParams}}{{#-first}}{{/-first}}
5754
// Query Parameters - {{baseName}}
5855
if (req.has_param("{{baseName}}"))
5956
{
@@ -160,12 +157,22 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
160157
{{/vendorExtensions.isOptional}}
161158
{{/items.vendorExtensions.isFloat}}
162159
{{^items.vendorExtensions.isInt}}{{^items.vendorExtensions.isLong}}{{^items.vendorExtensions.isDouble}}{{^items.vendorExtensions.isFloat}}
160+
{{#items.vendorExtensions.isEnum}}
161+
{{#vendorExtensions.isOptional}}
162+
params.m_{{paramName}}->emplace_back({{items.vendorExtensions.enumFromStringHelper}}(val));
163+
{{/vendorExtensions.isOptional}}
164+
{{^vendorExtensions.isOptional}}
165+
params.m_{{paramName}}.emplace_back({{items.vendorExtensions.enumFromStringHelper}}(val));
166+
{{/vendorExtensions.isOptional}}
167+
{{/items.vendorExtensions.isEnum}}
168+
{{^items.vendorExtensions.isEnum}}
163169
{{#vendorExtensions.isOptional}}
164170
params.m_{{paramName}}->emplace_back(val);
165171
{{/vendorExtensions.isOptional}}
166172
{{^vendorExtensions.isOptional}}
167173
params.m_{{paramName}}.emplace_back(val);
168174
{{/vendorExtensions.isOptional}}
175+
{{/items.vendorExtensions.isEnum}}
169176
{{/items.vendorExtensions.isFloat}}{{/items.vendorExtensions.isDouble}}{{/items.vendorExtensions.isLong}}{{/items.vendorExtensions.isInt}}
170177
}
171178
}
@@ -225,9 +232,9 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
225232
catch (const std::exception& e)
226233
{
227234
errors.push_back("Invalid query parameter '{{baseName}}': " + std::string(e.what()));
228-
}{{/vendorExtensions.isArray}}{{#vendorExtensions.isEnum}}try
235+
}{{/vendorExtensions.isArray}}{{^vendorExtensions.isArray}}{{#vendorExtensions.isEnum}}try
229236
{
230-
params.m_{{paramName}} = {{enumFromStringHelper}}(req.get_param_value("{{baseName}}"));
237+
params.m_{{paramName}} = {{requestType}}::{{vendorExtensions.enumFromStringHelper}}(req.get_param_value("{{baseName}}"));
231238
}
232239
catch (const std::exception& e)
233240
{
@@ -267,19 +274,16 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
267274
catch (const std::exception& e)
268275
{
269276
errors.push_back("Invalid query parameter '{{baseName}}': " + std::string(e.what()));
270-
}{{/vendorExtensions.isFloat}}{{^vendorExtensions.isObject}}{{^vendorExtensions.isArray}}{{^vendorExtensions.isEnum}}{{^vendorExtensions.isString}}{{^vendorExtensions.isInt}}{{^vendorExtensions.isLong}}{{^vendorExtensions.isBool}}{{^vendorExtensions.isDouble}}{{^vendorExtensions.isFloat}}// Fallback: direct assignment
271-
params.m_{{paramName}} = req.get_param_value("{{baseName}}");{{/vendorExtensions.isFloat}}{{/vendorExtensions.isDouble}}{{/vendorExtensions.isBool}}{{/vendorExtensions.isLong}}{{/vendorExtensions.isInt}}{{/vendorExtensions.isString}}{{/vendorExtensions.isEnum}}{{/vendorExtensions.isArray}}{{/vendorExtensions.isObject}}
277+
}{{/vendorExtensions.isFloat}}{{^vendorExtensions.isObject}}{{^vendorExtensions.isEnum}}{{^vendorExtensions.isString}}{{^vendorExtensions.isInt}}{{^vendorExtensions.isLong}}{{^vendorExtensions.isBool}}{{^vendorExtensions.isDouble}}{{^vendorExtensions.isFloat}}// Fallback: direct assignment
278+
params.m_{{paramName}} = req.get_param_value("{{baseName}}");{{/vendorExtensions.isFloat}}{{/vendorExtensions.isDouble}}{{/vendorExtensions.isBool}}{{/vendorExtensions.isLong}}{{/vendorExtensions.isInt}}{{/vendorExtensions.isString}}{{/vendorExtensions.isEnum}}{{/vendorExtensions.isObject}}{{/vendorExtensions.isArray}}
272279
}{{^vendorExtensions.isRequired}}{{#vendorExtensions.hasDefaultValue}}
273280
else
274281
{
275282
// Use default value for optional parameter
276283
params.m_{{paramName}} = {{{vendorExtensions.defaultValue}}};
277284
}{{/vendorExtensions.hasDefaultValue}}{{/vendorExtensions.isRequired}}
278285
{{/queryParams}}
279-
{{#headerParams}}
280-
{{#-first}}
281-
282-
{{/-first}}
286+
{{#headerParams}}{{#-first}}{{/-first}}
283287
// Header Parameters - {{baseName}}
284288
if (!req.get_header_value("{{baseName}}").empty())
285289
{
@@ -318,9 +322,9 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
318322
catch (const std::exception& e)
319323
{
320324
errors.push_back("Invalid header parameter '{{baseName}}': " + std::string(e.what()));
321-
}{{/vendorExtensions.isArray}}{{#vendorExtensions.isEnum}}try
325+
}{{/vendorExtensions.isArray}}{{^vendorExtensions.isArray}}{{#vendorExtensions.isEnum}}try
322326
{
323-
params.m_{{paramName}} = {{enumFromStringHelper}}(req.get_header_value("{{baseName}}"));
327+
params.m_{{paramName}} = {{requestType}}::{{vendorExtensions.enumFromStringHelper}}(req.get_header_value("{{baseName}}"));
324328
}
325329
catch (const std::exception& e)
326330
{
@@ -360,19 +364,16 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
360364
catch (const std::exception& e)
361365
{
362366
errors.push_back("Invalid header parameter '{{baseName}}': " + std::string(e.what()));
363-
}{{/vendorExtensions.isFloat}}{{^vendorExtensions.isObject}}{{^vendorExtensions.isArray}}{{^vendorExtensions.isEnum}}{{^vendorExtensions.isString}}{{^vendorExtensions.isInt}}{{^vendorExtensions.isLong}}{{^vendorExtensions.isBool}}{{^vendorExtensions.isDouble}}{{^vendorExtensions.isFloat}}// Fallback: direct assignment
364-
params.m_{{paramName}} = req.get_header_value("{{baseName}}");{{/vendorExtensions.isFloat}}{{/vendorExtensions.isDouble}}{{/vendorExtensions.isBool}}{{/vendorExtensions.isLong}}{{/vendorExtensions.isInt}}{{/vendorExtensions.isString}}{{/vendorExtensions.isEnum}}{{/vendorExtensions.isArray}}{{/vendorExtensions.isObject}}
367+
}{{/vendorExtensions.isFloat}}{{^vendorExtensions.isObject}}{{^vendorExtensions.isEnum}}{{^vendorExtensions.isString}}{{^vendorExtensions.isInt}}{{^vendorExtensions.isLong}}{{^vendorExtensions.isBool}}{{^vendorExtensions.isDouble}}{{^vendorExtensions.isFloat}}// Fallback: direct assignment
368+
params.m_{{paramName}} = req.get_header_value("{{baseName}}");{{/vendorExtensions.isFloat}}{{/vendorExtensions.isDouble}}{{/vendorExtensions.isBool}}{{/vendorExtensions.isLong}}{{/vendorExtensions.isInt}}{{/vendorExtensions.isString}}{{/vendorExtensions.isEnum}}{{/vendorExtensions.isObject}}{{/vendorExtensions.isArray}}
365369
}{{^vendorExtensions.isRequired}}{{#vendorExtensions.hasDefaultValue}}
366370
else
367371
{
368372
// Use default value for optional parameter
369373
params.m_{{paramName}} = {{{vendorExtensions.defaultValue}}};
370374
}{{/vendorExtensions.hasDefaultValue}}{{/vendorExtensions.isRequired}}
371375
{{/headerParams}}
372-
{{#pathParams}}
373-
{{#-first}}
374-
375-
{{/-first}}
376+
{{#pathParams}}{{#-first}}{{/-first}}
376377
// Path Parameters - {{baseName}} (index: {{vendorExtensions.pathIndex}})
377378
if (req.matches.size() < {{vendorExtensions.pathIndex}} + 1)
378379
{
@@ -400,17 +401,27 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
400401
{
401402
if (!item.empty())
402403
{
404+
{{#items.vendorExtensions.isEnum}}
405+
{{#vendorExtensions.isOptional}}
406+
params.m_{{paramName}}->emplace_back({{items.vendorExtensions.enumFromStringHelper}}(val));
407+
{{/vendorExtensions.isOptional}}
408+
{{^vendorExtensions.isOptional}}
409+
params.m_{{paramName}}.emplace_back({{items.vendorExtensions.enumFromStringHelper}}(val));
410+
{{/vendorExtensions.isOptional}}
411+
{{/items.vendorExtensions.isEnum}}
412+
{{^items.vendorExtensions.isEnum}}
403413
{{#vendorExtensions.isOptional}}
404414
params.m_{{paramName}}->emplace_back(item);
405415
{{/vendorExtensions.isOptional}}
406416
{{^vendorExtensions.isOptional}}
407417
params.m_{{paramName}}.emplace_back(item);
408418
{{/vendorExtensions.isOptional}}
419+
{{/items.vendorExtensions.isEnum}}
409420
}
410421
}
411-
{{/vendorExtensions.isArray}}
422+
{{/vendorExtensions.isArray}}
412423
{{#vendorExtensions.isEnum}}
413-
params.m_{{paramName}} = {{enumFromStringHelper}}(req.matches[{{vendorExtensions.pathIndex}}]);
424+
params.m_{{paramName}} = {{requestType}}::{{vendorExtensions.enumFromStringHelper}}(req.matches[{{vendorExtensions.pathIndex}}]);
414425
{{/vendorExtensions.isEnum}}
415426
{{#vendorExtensions.isString}}
416427
params.m_{{paramName}} = req.matches[{{vendorExtensions.pathIndex}}];
@@ -437,10 +448,8 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
437448
}
438449
}
439450
{{/pathParams}}
440-
{{#cookieParams}}
441-
{{#-first}}
451+
{{#cookieParams}}{{#-first}}{{/-first}}
442452

443-
{{/-first}}
444453
// Cookie Parameters - {{baseName}}
445454
try
446455
{
@@ -467,20 +476,25 @@ bool {{apiClassnameInPascalCase}}::parse{{operationIdPascalCase}}Params(const ht
467476
{
468477
if (!item.empty())
469478
{
479+
{{#items.vendorExtensions.isEnum}}
480+
{{#vendorExtensions.isOptional}}
481+
params.m_{{paramName}}->emplace_back({{items.vendorExtensions.enumFromStringHelper}}(item));
482+
{{/vendorExtensions.isOptional}}
483+
{{^vendorExtensions.isOptional}}
484+
params.m_{{paramName}}.emplace_back({{items.vendorExtensions.enumFromStringHelper}}(item));
485+
{{/vendorExtensions.isOptional}}
486+
{{/items.vendorExtensions.isEnum}}
487+
{{^items.vendorExtensions.isEnum}}
470488
{{#vendorExtensions.isOptional}}
471489
params.m_{{paramName}}->emplace_back(item);
472490
{{/vendorExtensions.isOptional}}
473491
{{^vendorExtensions.isOptional}}
474492
params.m_{{paramName}}.emplace_back(item);
475493
{{/vendorExtensions.isOptional}}
494+
{{/items.vendorExtensions.isEnum}}
476495
}
477-
}{{/vendorExtensions.isArray}}{{#vendorExtensions.isEnum}}params.m_{{paramName}} = {{enumFromStringHelper}}(cookieValue);{{/vendorExtensions.isEnum}}{{#vendorExtensions.isString}}params.m_{{paramName}} = cookieValue;{{/vendorExtensions.isString}}{{#vendorExtensions.isInt}}params.m_{{paramName}} = std::stoi(cookieValue);{{/vendorExtensions.isInt}}{{#vendorExtensions.isLong}}params.m_{{paramName}} = std::stoll(cookieValue);{{/vendorExtensions.isLong}}{{#vendorExtensions.isBool}}params.m_{{paramName}} = (cookieValue == "true");{{/vendorExtensions.isBool}}{{#vendorExtensions.isDouble}}params.m_{{paramName}} = std::stod(cookieValue);{{/vendorExtensions.isDouble}}{{#vendorExtensions.isFloat}}params.m_{{paramName}} = std::stof(cookieValue);{{/vendorExtensions.isFloat}}{{^vendorExtensions.isObject}}{{^vendorExtensions.isArray}}{{^vendorExtensions.isEnum}}{{^vendorExtensions.isString}}{{^vendorExtensions.isInt}}{{^vendorExtensions.isLong}}{{^vendorExtensions.isBool}}{{^vendorExtensions.isDouble}}{{^vendorExtensions.isFloat}}params.m_{{paramName}} = cookieValue;{{/vendorExtensions.isFloat}}{{/vendorExtensions.isDouble}}{{/vendorExtensions.isBool}}{{/vendorExtensions.isLong}}{{/vendorExtensions.isInt}}{{/vendorExtensions.isString}}{{/vendorExtensions.isEnum}}{{/vendorExtensions.isArray}}{{/vendorExtensions.isObject}}
478-
}{{^vendorExtensions.isRequired}}{{#vendorExtensions.hasDefaultValue}}
479-
else
480-
{
481-
// Use default value for optional parameter
482-
params.m_{{paramName}} = {{{vendorExtensions.defaultValue}}};
483-
}{{/vendorExtensions.hasDefaultValue}}{{/vendorExtensions.isRequired}}
496+
}{{/vendorExtensions.isArray}}{{#vendorExtensions.isEnum}}params.m_{{paramName}} = {{requestType}}::{{vendorExtensions.enumFromStringHelper}}(cookieValue);{{/vendorExtensions.isEnum}}{{^vendorExtensions.isEnum}}{{#vendorExtensions.isInt}}params.m_{{paramName}} = std::stoi(cookieValue);{{/vendorExtensions.isInt}}{{#vendorExtensions.isLong}}params.m_{{paramName}} = std::stoll(cookieValue);{{/vendorExtensions.isLong}}{{#vendorExtensions.isBool}}params.m_{{paramName}} = (cookieValue == "true");{{/vendorExtensions.isBool}}{{#vendorExtensions.isDouble}}params.m_{{paramName}} = std::stod(cookieValue);{{/vendorExtensions.isDouble}}{{#vendorExtensions.isFloat}}params.m_{{paramName}} = std::stof(cookieValue);{{/vendorExtensions.isFloat}}{{#vendorExtensions.isString}}params.m_{{paramName}} = cookieValue;{{/vendorExtensions.isString}}{{/vendorExtensions.isEnum}}
497+
}
484498
}{{^vendorExtensions.isRequired}}{{#vendorExtensions.hasDefaultValue}}
485499
else
486500
{
@@ -744,7 +758,7 @@ void {{apiClassnameInPascalCase}}::registerRoutes(httplib::Server& svr{{#hasAnyA
744758
{{#operations}}
745759
{{#operation}}
746760
{{#vendorExtensions}}
747-
svr.{{httpMethod}}("{{path}}", [this{{#hasAuth}}, auth{{/hasAuth}}]([[maybe_unused]] const httplib::Request& req, httplib::Response& res)
761+
svr.{{httpMethod}}("{{httplibPath}}", [this{{#hasAuth}}, auth{{/hasAuth}}]([[maybe_unused]] const httplib::Request& req, httplib::Response& res)
748762
{
749763
handle{{operationIdPascalCase}}Request(req, res{{#hasAuth}}, auth{{/hasAuth}});
750764
});

0 commit comments

Comments
 (0)