From 5697797cb7849fb2fc341be3f22d60b95a19bc94 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 24 Oct 2016 01:05:35 +0100 Subject: Refactor route processor into smaller functions --- icespider/compile/routeCompiler.cpp | 231 +++++++++++++++++++----------------- icespider/compile/routeCompiler.h | 2 + 2 files changed, 124 insertions(+), 109 deletions(-) diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp index 31716ad..d8f7f35 100644 --- a/icespider/compile/routeCompiler.cpp +++ b/icespider/compile/routeCompiler.cpp @@ -297,142 +297,155 @@ namespace IceSpider { } } + processRoutes(output, c, units); + + fprintf(output, "\n// End generated code.\n"); + } + + void + RouteCompiler::processRoutes(FILE * output, RouteConfigurationPtr c, const Units & u) const + { fprintf(output, "\n"); fprintbf(output, "namespace %s {\n", c->name); fprintbf(1, output, "// Implementation classes.\n\n"); for (const auto & r : c->routes) { - std::string methodName = getEnumString(r.second->method); - - fprintbf(1, output, "// Route name: %s\n", r.first); - fprintbf(1, output, "// path: %s\n", r.second->path); - fprintbf(1, output, "class %s : public IceSpider::IRouteHandler {\n", r.first); - fprintbf(2, output, "public:\n"); - fprintbf(3, output, "%s(const IceSpider::Core * core) :\n", r.first); - fprintbf(4, output, "IceSpider::IRouteHandler(IceSpider::HttpMethod::%s, \"%s\")", methodName, r.second->path); - auto proxies = initializeProxies(output, r.second); - for (const auto & p : r.second->params) { - if (p.second->hasUserSource) { - if (p.second->source == ParameterSource::URL) { - fprintf(output, ",\n"); - Path path(r.second->path); - unsigned int idx = -1; - for (const auto & pp : path.parts) { - if (auto par = dynamic_cast(pp.get())) { - if (par->name == p.second->key) { - idx = &pp - &path.parts.front(); - } + processRoute(output, r, u); + } + fprintbf(output, "} // namespace %s\n\n", c->name); + fprintf(output, "// Register route handlers.\n"); + for (const auto & r : c->routes) { + fprintbf(output, "FACTORY(%s::%s, IceSpider::RouteHandlerFactory);\n", c->name, r.first); + } + } + + void + RouteCompiler::processRoute(FILE * output, const Routes::value_type & r, const Units & units) const + { + std::string methodName = getEnumString(r.second->method); + + fprintbf(1, output, "// Route name: %s\n", r.first); + fprintbf(1, output, "// path: %s\n", r.second->path); + fprintbf(1, output, "class %s : public IceSpider::IRouteHandler {\n", r.first); + fprintbf(2, output, "public:\n"); + fprintbf(3, output, "%s(const IceSpider::Core * core) :\n", r.first); + fprintbf(4, output, "IceSpider::IRouteHandler(IceSpider::HttpMethod::%s, \"%s\")", methodName, r.second->path); + auto proxies = initializeProxies(output, r.second); + for (const auto & p : r.second->params) { + if (p.second->hasUserSource) { + if (p.second->source == ParameterSource::URL) { + fprintf(output, ",\n"); + Path path(r.second->path); + unsigned int idx = -1; + for (const auto & pp : path.parts) { + if (auto par = dynamic_cast(pp.get())) { + if (par->name == p.second->key) { + idx = &pp - &path.parts.front(); } - }; - fprintbf(4, output, "_pi_%s(%d)", p.first, idx); - } - else { - if (p.second->key) { - fprintf(output, ",\n"); - fprintbf(4, output, "_pn_%s(\"%s\")", p.first, *p.second->key); } - } + }; + fprintbf(4, output, "_pi_%s(%d)", p.first, idx); } - if (p.second->defaultExpr) { - fprintf(output, ",\n"); - fprintbf(4, output, "_pd_%s(%s)", - p.first, p.second->defaultExpr.get()); + else { + if (p.second->key) { + fprintf(output, ",\n"); + fprintbf(4, output, "_pn_%s(\"%s\")", p.first, *p.second->key); + } } } - fprintf(output, "\n"); - fprintbf(3, output, "{\n"); - registerOutputSerializers(output, r.second); - fprintbf(3, output, "}\n\n"); - fprintbf(3, output, "~%s()\n", r.first); - fprintbf(3, output, "{\n"); - releaseOutputSerializers(output, r.second); - fprintbf(3, output, "}\n\n"); - fprintbf(3, output, "void execute(IceSpider::IHttpRequest * request) const\n"); - fprintbf(3, output, "{\n"); - auto ps = findParameters(r.second, units); - bool doneBody = false; - for (const auto & p : r.second->params) { - if (p.second->hasUserSource) { - auto ip = ps.find(p.first)->second; - if (p.second->source == ParameterSource::Body) { - if (p.second->key) { - if (!doneBody) { - if (p.second->type) { - fprintbf(4, output, "auto _pbody(request->getBody<%s>());\n", - *p.second->type); - } - else { - fprintbf(4, output, "auto _pbody(request->getBody());\n"); - } - doneBody = true; - } + if (p.second->defaultExpr) { + fprintf(output, ",\n"); + fprintbf(4, output, "_pd_%s(%s)", + p.first, p.second->defaultExpr.get()); + } + } + fprintf(output, "\n"); + fprintbf(3, output, "{\n"); + registerOutputSerializers(output, r.second); + fprintbf(3, output, "}\n\n"); + fprintbf(3, output, "~%s()\n", r.first); + fprintbf(3, output, "{\n"); + releaseOutputSerializers(output, r.second); + fprintbf(3, output, "}\n\n"); + fprintbf(3, output, "void execute(IceSpider::IHttpRequest * request) const\n"); + fprintbf(3, output, "{\n"); + auto ps = findParameters(r.second, units); + bool doneBody = false; + for (const auto & p : r.second->params) { + if (p.second->hasUserSource) { + auto ip = ps.find(p.first)->second; + if (p.second->source == ParameterSource::Body) { + if (p.second->key) { + if (!doneBody) { if (p.second->type) { - fprintbf(4, output, "auto _p_%s(_pbody->%s", - p.first, p.first); + fprintbf(4, output, "auto _pbody(request->getBody<%s>());\n", + *p.second->type); } else { - fprintbf(4, output, "auto _p_%s(request->getBodyParam<%s>(_pbody, _pn_%s)", - p.first, Slice::typeToString(ip->type()), - p.first); + fprintbf(4, output, "auto _pbody(request->getBody());\n"); } + doneBody = true; + } + if (p.second->type) { + fprintbf(4, output, "auto _p_%s(_pbody->%s", + p.first, p.first); } else { - fprintbf(4, output, "auto _p_%s(request->getBody<%s>()", - p.first, Slice::typeToString(ip->type())); + fprintbf(4, output, "auto _p_%s(request->getBodyParam<%s>(_pbody, _pn_%s)", + p.first, Slice::typeToString(ip->type()), + p.first); } } else { - fprintbf(4, output, "auto _p_%s(request->get%sParam<%s>(_p%c_%s)", - p.first, getEnumString(p.second->source), Slice::typeToString(ip->type()), - p.second->source == ParameterSource::URL ? 'i' : 'n', - p.first); - } - if (!p.second->isOptional && p.second->source != ParameterSource::URL) { - fprintbf(0, output, " /\n"); - if (p.second->defaultExpr) { - fprintbf(5, output, " [this]() { return _pd_%s; }", - p.first); - } - else { - fprintbf(5, output, " [this]() { return requiredParameterNotFound<%s>(\"%s\", _pn_%s); }", - Slice::typeToString(ip->type()), getEnumString(p.second->source), p.first); - } + fprintbf(4, output, "auto _p_%s(request->getBody<%s>()", + p.first, Slice::typeToString(ip->type())); } - fprintbf(0, output, ");\n"); } - } - if (r.second->operation) { - addSingleOperation(output, r.second, findOperation(*r.second->operation, units)); - } - else { - addMashupOperations(output, r.second, proxies, units); - } - fprintbf(3, output, "}\n\n"); - fprintbf(2, output, "private:\n"); - declareProxies(output, proxies); - for (const auto & p : r.second->params) { - if (p.second->hasUserSource) { - if (p.second->source == ParameterSource::URL) { - fprintbf(3, output, "const unsigned int _pi_%s;\n", p.first); + else { + fprintbf(4, output, "auto _p_%s(request->get%sParam<%s>(_p%c_%s)", + p.first, getEnumString(p.second->source), Slice::typeToString(ip->type()), + p.second->source == ParameterSource::URL ? 'i' : 'n', + p.first); + } + if (!p.second->isOptional && p.second->source != ParameterSource::URL) { + fprintbf(0, output, " /\n"); + if (p.second->defaultExpr) { + fprintbf(5, output, " [this]() { return _pd_%s; }", + p.first); } else { - fprintbf(3, output, "const std::string _pn_%s;\n", p.first); + fprintbf(5, output, " [this]() { return requiredParameterNotFound<%s>(\"%s\", _pn_%s); }", + Slice::typeToString(ip->type()), getEnumString(p.second->source), p.first); } } - if (p.second->defaultExpr) { - auto ip = ps.find(p.first)->second; - fprintbf(3, output, "const %s _pd_%s;\n", - Slice::typeToString(ip->type()), p.first); - - } + fprintbf(0, output, ");\n"); } - fprintbf(1, output, "};\n\n"); } - fprintbf(output, "} // namespace %s\n\n", c->name); - fprintf(output, "// Register route handlers.\n"); - for (const auto & r : c->routes) { - fprintbf(output, "FACTORY(%s::%s, IceSpider::RouteHandlerFactory);\n", c->name, r.first); + if (r.second->operation) { + addSingleOperation(output, r.second, findOperation(*r.second->operation, units)); } - fprintf(output, "\n// End generated code.\n"); + else { + addMashupOperations(output, r.second, proxies, units); + } + fprintbf(3, output, "}\n\n"); + fprintbf(2, output, "private:\n"); + declareProxies(output, proxies); + for (const auto & p : r.second->params) { + if (p.second->hasUserSource) { + if (p.second->source == ParameterSource::URL) { + fprintbf(3, output, "const unsigned int _pi_%s;\n", p.first); + } + else { + fprintbf(3, output, "const std::string _pn_%s;\n", p.first); + } + } + if (p.second->defaultExpr) { + auto ip = ps.find(p.first)->second; + fprintbf(3, output, "const %s _pd_%s;\n", + Slice::typeToString(ip->type()), p.first); + + } + } + fprintbf(1, output, "};\n\n"); } RouteCompiler::Proxies diff --git a/icespider/compile/routeCompiler.h b/icespider/compile/routeCompiler.h index 6116d51..0b5256a 100644 --- a/icespider/compile/routeCompiler.h +++ b/icespider/compile/routeCompiler.h @@ -28,6 +28,8 @@ namespace IceSpider { typedef std::map Proxies; void processConfiguration(FILE * output, FILE * outputh, const std::string & name, RouteConfigurationPtr, const Units &) const; + void processRoutes(FILE * output, RouteConfigurationPtr, const Units &) const; + void processRoute(FILE * output, const Routes::value_type &, const Units &) const; void registerOutputSerializers(FILE * output, RoutePtr) const; void releaseOutputSerializers(FILE * output, RoutePtr) const; Proxies initializeProxies(FILE * output, RoutePtr) const; -- cgit v1.2.3