From 5bde13ceae94ed0475ee5ea2e7d438898b180561 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 17 Sep 2016 16:22:04 +0100 Subject: Parameters should be a map, not a list --- icespider/common/routes.ice | 4 +-- icespider/compile/routeCompiler.cpp | 72 +++++++++++++++++-------------------- icespider/unittests/testRoutes.json | 54 +++++++++++++--------------- 3 files changed, 58 insertions(+), 72 deletions(-) diff --git a/icespider/common/routes.ice b/icespider/common/routes.ice index 6d022fb..e238664 100644 --- a/icespider/common/routes.ice +++ b/icespider/common/routes.ice @@ -9,7 +9,6 @@ module IceSpider { dictionary StringMap; class Parameter { - string name; ParameterSource source = URL; optional(0) string key; bool isOptional = false; @@ -20,7 +19,8 @@ module IceSpider { bool hasUserSource = true; }; - sequence Parameters; + ["slicer:json:object"] + dictionary Parameters; class OutputSerializer { string contentType; diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp index a6fa236..0f603f5 100644 --- a/icespider/compile/routeCompiler.cpp +++ b/icespider/compile/routeCompiler.cpp @@ -121,18 +121,14 @@ namespace IceSpider { } auto ps = findParameters(r, u); for (const auto & p : ps) { - auto defined = std::find_if(r->params.begin(), r->params.end(), [p](const auto & rp) { - return p.first == rp->name; - }); + auto defined = r->params.find(p.first); if (defined != r->params.end()) { - auto d = *defined; - if (!d->key) d->key = d->name; + if (!defined->second->key) defined->second->key = defined->first; } else { - r->params.push_back(new Parameter(p.first, ParameterSource::URL, p.first, false, IceUtil::Optional(), false)); - defined = --r->params.end(); + defined = r->params.insert({ p.first, new Parameter(ParameterSource::URL, p.first, false, IceUtil::Optional(), false) }).first; } - auto d = *defined; + auto d = defined->second; if (d->source == ParameterSource::URL) { Path path(r->path); d->hasUserSource = std::find_if(path.parts.begin(), path.parts.end(), [d](const auto & pp) { @@ -299,28 +295,28 @@ namespace IceSpider { fprintbf(4, output, "IceSpider::IRouteHandler(IceSpider::HttpMethod::%s, \"%s\")", methodName, r->path); auto proxies = initializeProxies(output, r); for (const auto & p : r->params) { - if (p->hasUserSource) { + if (p.second->hasUserSource) { fprintf(output, ",\n"); - if (p->source == ParameterSource::URL) { + if (p.second->source == ParameterSource::URL) { Path path(r->path); unsigned int idx = -1; for (const auto & pp : path.parts) { if (auto par = dynamic_cast(pp.get())) { - if (par->name == p->key) { + if (par->name == p.second->key) { idx = &pp - &path.parts.front(); } } }; - fprintbf(4, output, "_pi_%s(%d)", p->name, idx); + fprintbf(4, output, "_pi_%s(%d)", p.first, idx); } else { - fprintbf(4, output, "_pn_%s(\"%s\")", p->name, *p->key); + fprintbf(4, output, "_pn_%s(\"%s\")", p.first, *p.second->key); } } - if (p->defaultExpr) { + if (p.second->defaultExpr) { fprintf(output, ",\n"); fprintbf(4, output, "_pd_%s(%s)", - p->name, p->defaultExpr.get()); + p.first, p.second->defaultExpr.get()); } } fprintf(output, "\n"); @@ -335,21 +331,21 @@ namespace IceSpider { fprintbf(3, output, "{\n"); auto ps = findParameters(r, units); for (const auto & p : r->params) { - if (p->hasUserSource) { - auto ip = ps.find(p->name)->second; + if (p.second->hasUserSource) { + auto ip = ps.find(p.first)->second; fprintbf(4, output, "auto _p_%s(request->get%sParam<%s>(_p%c_%s)", - p->name, getEnumString(p->source), Slice::typeToString(ip->type()), - p->source == ParameterSource::URL ? 'i' : 'n', - p->name); - if (!p->isOptional && p->source != ParameterSource::URL) { + 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->defaultExpr) { + if (p.second->defaultExpr) { fprintbf(5, output, " [this]() { return _pd_%s; }", - p->name); + p.first); } else { fprintbf(5, output, " [this]() { return requiredParameterNotFound<%s>(\"%s\", _pn_%s); }", - Slice::typeToString(ip->type()), getEnumString(p->source), p->name); + Slice::typeToString(ip->type()), getEnumString(p.second->source), p.first); } } fprintbf(0, output, ");\n"); @@ -365,18 +361,18 @@ namespace IceSpider { fprintbf(2, output, "private:\n"); declareProxies(output, proxies); for (const auto & p : r->params) { - if (p->hasUserSource) { - if (p->source == ParameterSource::URL) { - fprintbf(3, output, "const unsigned int _pi_%s;\n", p->name); + 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->name); + fprintbf(3, output, "const std::string _pn_%s;\n", p.first); } } - if (p->defaultExpr) { - auto ip = ps.find(p->name)->second; + if (p.second->defaultExpr) { + auto ip = ps.find(p.first)->second; fprintbf(3, output, "const %s _pd_%s;\n", - Slice::typeToString(ip->type()), p->name); + Slice::typeToString(ip->type()), p.first); } } @@ -403,7 +399,7 @@ namespace IceSpider { fprintbf(4, output, "prx%d(core->getProxy<%s>())", n, boost::algorithm::replace_all_copy(proxyName, ".", "::")); n += 1; } - } + } return proxies; } @@ -426,10 +422,8 @@ namespace IceSpider { fprintbf(4, output, "prx0->%s(", operation); } for (const auto & p : o->parameters()) { - auto rp = *std::find_if(r->params.begin(), r->params.end(), [p](const auto & rp) { - return rp->name == p->name(); - }); - if (rp->hasUserSource) { + auto rp = *r->params.find(p->name()); + if (rp.second->hasUserSource) { fprintbf(output, "_p_%s, ", p->name()); } else { @@ -456,10 +450,8 @@ namespace IceSpider { auto so = findOperation(o.second->operation, us); for (const auto & p : so->parameters()) { auto po = o.second->paramOverrides.find(p->name()); - auto rp = *std::find_if(r->params.begin(), r->params.end(), [p,po,o](const auto & rp) { - return rp->name == (po != o.second->paramOverrides.end() ? po->second : p->name()); - }); - if (rp->hasUserSource) { + auto rp = *r->params.find(po != o.second->paramOverrides.end() ? po->second : p->name()); + if (rp.second->hasUserSource) { fprintbf(output, "_p_%s, ", p->name()); } else { diff --git a/icespider/unittests/testRoutes.json b/icespider/unittests/testRoutes.json index daf090d..52add90 100644 --- a/icespider/unittests/testRoutes.json +++ b/icespider/unittests/testRoutes.json @@ -32,42 +32,38 @@ "path": "/{id}", "method": "POST", "operation": "TestIceSpider.TestApi.complexParam", - "params": [ - { - "name": "s", - "source": "URL", - "key": "id", - "isOptional": true - }, - { - "name": "m", - "source": "Body" + "params": { + "s": { + "source": "URL", + "key": "id", + "isOptional": true + }, + "m": { + "source": "Body" + } } - ] }, { "name": "defaultItem", "path": "/item/{s}", "method": "GET", "operation": "TestIceSpider.TestApi.withParams", - "params": [ - { - "name": "i", - "default": "1234" + "params": { + "i": { + "default": "1234" + } } - ] }, { "name": "itemWithDefault", "path": "/item/{s}/{i}", "method": "GET", "operation": "TestIceSpider.TestApi.withParams", - "params": [ - { - "name": "i", - "default": "1234" + "params": { + "i": { + "default": "1234" + } } - ] }, { "name": "mashStruct", @@ -121,16 +117,14 @@ "path": "/search", "method": "GET", "operation": "TestIceSpider.TestApi.withParams", - "params": [ - { - "name": "s", - "source": "QueryString" - }, - { - "name": "i", - "source": "QueryString" + "params": { + "s": { + "source": "QueryString" + }, + "i": { + "source": "QueryString" + } } - ] } ], "slices": [ -- cgit v1.2.3