summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2016-10-25 00:29:25 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2016-10-25 00:29:25 +0100
commit00e3f82489a6ef93394275ae61079d08f44347ea (patch)
treee6d378a53d4759d38506b85f975df5ca43d86e1f
parentMove includes into header (diff)
downloadicespider-00e3f82489a6ef93394275ae61079d08f44347ea.tar.bz2
icespider-00e3f82489a6ef93394275ae61079d08f44347ea.tar.xz
icespider-00e3f82489a6ef93394275ae61079d08f44347ea.zip
Add basic support for base classes for routes
-rw-r--r--icespider/common/routes.ice10
-rw-r--r--icespider/compile/routeCompiler.cpp57
-rw-r--r--icespider/compile/routeCompiler.h2
-rw-r--r--icespider/unittests/testRoutes.json7
4 files changed, 75 insertions, 1 deletions
diff --git a/icespider/common/routes.ice b/icespider/common/routes.ice
index 37939c1..db6475d 100644
--- a/icespider/common/routes.ice
+++ b/icespider/common/routes.ice
@@ -45,14 +45,24 @@ module IceSpider {
Operations operations;
string type;
OutputSerializers outputSerializers;
+ StringSeq bases;
};
["slicer:json:object"]
dictionary<string, Route> Routes;
+ class RouteBase {
+ StringSeq proxies;
+ StringSeq functions;
+ };
+
+ ["slicer:json:object"]
+ dictionary<string, RouteBase> RouteBases;
+
class RouteConfiguration {
string name;
Routes routes;
+ RouteBases routeBases;
StringSeq slices;
StringSeq headers;
};
diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp
index 0d9be5f..30f7900 100644
--- a/icespider/compile/routeCompiler.cpp
+++ b/icespider/compile/routeCompiler.cpp
@@ -297,12 +297,58 @@ namespace IceSpider {
}
}
+ processBases(output, outputh, c, units);
processRoutes(output, c, units);
fprintf(output, "\n// End generated code.\n");
}
void
+ RouteCompiler::processBases(FILE * output, FILE * outputh, RouteConfigurationPtr c, const Units & u) const
+ {
+ fprintf(outputh, "\n");
+ fprintbf(outputh, "namespace %s {\n", c->name);
+ fprintbf(1, outputh, "// Base classes.\n\n");
+ fprintf(output, "\n");
+ fprintbf(output, "namespace %s {\n", c->name);
+ fprintbf(1, output, "// Base classes.\n\n");
+ for (const auto & r : c->routeBases) {
+ processBase(output, outputh, r, u);
+ }
+ fprintbf(output, "} // namespace %s\n\n", c->name);
+ fprintbf(outputh, "} // namespace %s\n\n", c->name);
+ }
+
+ void
+ RouteCompiler::processBase(FILE * output, FILE * outputh, const RouteBases::value_type & b, const Units &) const
+ {
+ fprintbf(1, outputh, "class %s {\n", b.first);
+ fprintbf(2, outputh, "protected:\n");
+ fprintbf(3, outputh, "%s(const IceSpider::Core * core);\n\n", b.first);
+ for (const auto & f: b.second->functions) {
+ fprintbf(3, outputh, "%s;\n", f);
+ }
+ fprintbf(1, output, "%s::%s(const IceSpider::Core * core)", b.first, b.first);
+ if (!b.second->proxies.empty()) {
+ fprintf(output, " :");
+ }
+ fprintf(output, "\n");
+ unsigned int pn = 0;
+ for (const auto & p : b.second->proxies) {
+ fprintbf(3, outputh, "const %sPrx prx%u;\n",
+ boost::algorithm::replace_all_copy(p, ".", "::"), pn);
+ fprintbf(3, output, "prx%u(core->getProxy<%s>())",
+ pn, boost::algorithm::replace_all_copy(p, ".", "::"));
+ if (++pn < b.second->proxies.size()) {
+ fprintf(output, ",");
+ }
+ fprintf(output, "\n");
+ }
+ fprintbf(1, outputh, "}; // %s\n", b.first);
+ fprintbf(1, output, "{ }\n");
+ }
+
+ void
RouteCompiler::processRoutes(FILE * output, RouteConfigurationPtr c, const Units & u) const
{
fprintf(output, "\n");
@@ -325,10 +371,19 @@ namespace IceSpider {
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(1, output, "class %s : public IceSpider::IRouteHandler", r.first);
+ for (const auto & b : r.second->bases) {
+ fprintf(output, ",\n");
+ fprintbf(3, output, "public %s", b);
+ }
+ fprintf(output, " {\n");
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);
+ for (const auto & b : r.second->bases) {
+ fprintf(output, ",\n");
+ fprintbf(4, output, "%s(core)", b);
+ }
auto proxies = initializeProxies(output, r.second);
for (const auto & p : r.second->params) {
if (p.second->hasUserSource) {
diff --git a/icespider/compile/routeCompiler.h b/icespider/compile/routeCompiler.h
index 0b5256a..9a2eb8f 100644
--- a/icespider/compile/routeCompiler.h
+++ b/icespider/compile/routeCompiler.h
@@ -28,6 +28,8 @@ namespace IceSpider {
typedef std::map<std::string, int> Proxies;
void processConfiguration(FILE * output, FILE * outputh, const std::string & name, RouteConfigurationPtr, const Units &) const;
+ void processBases(FILE * output, FILE * outputh, RouteConfigurationPtr, const Units &) const;
+ void processBase(FILE * output, FILE * outputh, const RouteBases::value_type &, 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;
diff --git a/icespider/unittests/testRoutes.json b/icespider/unittests/testRoutes.json
index 3bc6fda..bc1b94f 100644
--- a/icespider/unittests/testRoutes.json
+++ b/icespider/unittests/testRoutes.json
@@ -1,6 +1,12 @@
{
"name": "common",
"headers": [ "xsltStreamSerializer.h" ],
+ "routeBases": {
+ "base1": {
+ "proxies": ["TestIceSpider.TestApi"],
+ "functions": [ "void doNothing()" ]
+ }
+ },
"routes": {
"index": {
"path": "/",
@@ -11,6 +17,7 @@
"params": [ "\"xslt/transform.xslt\"" ]
}
},
+ "bases": [ "base1" ],
"operation": "TestIceSpider.TestApi.index"
},
"item": {