mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-12 20:50:55 +00:00
* [C++][Pistache] Refactor setupSupportingFiles Supporting files are set up in the CppPistacheServerCodegen() constructor as well as in processOpts(). Refactor the code and extract a method setupSupportingFiles(). * [C++][Pistache] Refactor: Simplify isQueryParam condition Both branches of the if/else do the same steps. Refactor this out and invert logic. * [C++][Pistache] Refactor: Add injectImplInFilename Both branches of the if/else if do the similar steps and are dependent on the suffix. Make this obvious by introducing a new method injectImplInFilename(String result, String suffix). * [C++][Pistache] Refactor: injectImplInFilename: remove index search We do not need the separatorChar index to inject the "Impl" string. Simply truncate the whole string. Also rename the parameter from 'result' to' filename'. * CppPistacheServer: Refactor postProcessOperationsWithModels Pull out the post-processing for a single operation, and also pull out post-processing for parameters. Introduce boolean expressions for supported parsing per parameter, and consumption of JSON. Reorder code to make locality more explicit i.e. how consumeJSON and isParsingSupported is generated and used. * CppPistacheServer: Refactor to use functional matching Functional matching like anyMatch() directly state what boolean value is searched. However, the Predicates deserve to heave names themselves. * CppPistacheServer: Add base class for Api Looking at the generated main-api-server.cpp code it gets obvious that the API classes are self similar with a similar interface. Only the construction and teh initialization is called in the main() function. Leverage this fact to create a generalization ApiBase. Introduce ApiBase as a pure virtual base class to the concrete API classes and declare init() as virtual. Pull the route member into the base class. With this change we could have a container hold all the ApiImpl objects later and call init() on all of them using a for_each loop. * CppPistacheServer: Use ApiBase for ApiImpl storage Refactor the main-api-server template to use a vector for ApiImpl storage instead of separate objects. This leverages the previously added ApiBase generalization. We push all concrete ApiImpl objects into a vector and call init() on each of them. * [C++][Pistache]: Update generated sample Due to teh addition of ApiBase class update the generated sample. * [C++][Pistache] Add comment for postProcessSingleParam * [C++][Pistache] Rename and comment implFilenameFromApiFilename While writing the comment, I realized that the method name could be more precise. Thus rename injectImplInFilename to implFilenameFromApiFilename and add comment.
98 lines
2.5 KiB
C++
98 lines
2.5 KiB
C++
/**
|
|
* OpenAPI Petstore
|
|
* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.
|
|
*
|
|
* The version of the OpenAPI document: 1.0.0
|
|
*
|
|
*
|
|
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
* https://openapi-generator.tech
|
|
* Do not edit the class manually.
|
|
*/
|
|
|
|
|
|
#include "pistache/endpoint.h"
|
|
#include "pistache/http.h"
|
|
#include "pistache/router.h"
|
|
#ifdef __linux__
|
|
#include <vector>
|
|
#include <signal.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include "ApiBase.h"
|
|
|
|
#include "PetApiImpl.h"
|
|
#include "StoreApiImpl.h"
|
|
#include "UserApiImpl.h"
|
|
|
|
#define PISTACHE_SERVER_THREADS 2
|
|
#define PISTACHE_SERVER_MAX_REQUEST_SIZE 32768
|
|
#define PISTACHE_SERVER_MAX_RESPONSE_SIZE 32768
|
|
|
|
static Pistache::Http::Endpoint *httpEndpoint;
|
|
#ifdef __linux__
|
|
static void sigHandler [[noreturn]] (int sig){
|
|
switch(sig){
|
|
case SIGINT:
|
|
case SIGQUIT:
|
|
case SIGTERM:
|
|
case SIGHUP:
|
|
default:
|
|
httpEndpoint->shutdown();
|
|
break;
|
|
}
|
|
exit(0);
|
|
}
|
|
|
|
static void setUpUnixSignals(std::vector<int> quitSignals) {
|
|
sigset_t blocking_mask;
|
|
sigemptyset(&blocking_mask);
|
|
for (auto sig : quitSignals)
|
|
sigaddset(&blocking_mask, sig);
|
|
|
|
struct sigaction sa;
|
|
sa.sa_handler = sigHandler;
|
|
sa.sa_mask = blocking_mask;
|
|
sa.sa_flags = 0;
|
|
|
|
for (auto sig : quitSignals)
|
|
sigaction(sig, &sa, nullptr);
|
|
}
|
|
#endif
|
|
|
|
using namespace org::openapitools::server::api;
|
|
|
|
int main() {
|
|
#ifdef __linux__
|
|
std::vector<int> sigs{SIGQUIT, SIGINT, SIGTERM, SIGHUP};
|
|
setUpUnixSignals(sigs);
|
|
#endif
|
|
Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(8080));
|
|
|
|
httpEndpoint = new Pistache::Http::Endpoint((addr));
|
|
auto router = std::make_shared<Pistache::Rest::Router>();
|
|
|
|
auto opts = Pistache::Http::Endpoint::options()
|
|
.threads(PISTACHE_SERVER_THREADS);
|
|
opts.flags(Pistache::Tcp::Options::ReuseAddr);
|
|
opts.maxRequestSize(PISTACHE_SERVER_MAX_REQUEST_SIZE);
|
|
opts.maxResponseSize(PISTACHE_SERVER_MAX_RESPONSE_SIZE);
|
|
httpEndpoint->init(opts);
|
|
|
|
auto apiImpls = std::vector<std::shared_ptr<ApiBase>>();
|
|
|
|
apiImpls.push_back(std::make_shared<PetApiImpl>(router));
|
|
apiImpls.push_back(std::make_shared<StoreApiImpl>(router));
|
|
apiImpls.push_back(std::make_shared<UserApiImpl>(router));
|
|
|
|
for (auto api : apiImpls) {
|
|
api->init();
|
|
}
|
|
|
|
httpEndpoint->setHandler(router->handler());
|
|
httpEndpoint->serve();
|
|
|
|
httpEndpoint->shutdown();
|
|
}
|