Allow 4.json and 4.3.json format; needs -lit(".") >> -lit("json") hack^Wworkaround

Rainer Deyke's workaround without the need to do ugly backtracking.

References:
- http://lists.boost.org/boost-users/2016/03/85960.php
- https://github.com/Project-OSRM/osrm-backend/issues/2173#issuecomment-204342785
This commit is contained in:
Daniel J. Hofmann 2016-04-05 16:02:29 +02:00 committed by Patrick Niklaus
parent 221f70ac7b
commit 0274afa0f7
5 changed files with 53 additions and 80 deletions

View File

@ -3,14 +3,15 @@
#include "engine/api/match_parameters.hpp"
//#define BOOST_SPIRIT_DEBUG
#include "server/api/base_parameters_grammar.hpp"
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_uint.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_bool.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_optional.hpp>
#include <boost/spirit/include/qi_uint.hpp>
namespace osrm
{
@ -31,33 +32,24 @@ struct MatchParametersGrammar final : public BaseParametersGrammar
MatchParametersGrammar() : BaseParametersGrammar(root_rule, parameters)
{
const auto set_geojson_type = [this]()
{
const auto set_geojson_type = [this] {
parameters.geometries = engine::api::RouteParameters::GeometriesType::GeoJSON;
};
const auto set_polyline_type = [this]()
{
const auto set_polyline_type = [this] {
parameters.geometries = engine::api::RouteParameters::GeometriesType::Polyline;
};
const auto set_simplified_type = [this]()
{
const auto set_simplified_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::Simplified;
};
const auto set_full_type = [this]()
{
const auto set_full_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::Full;
};
const auto set_false_type = [this]()
{
const auto set_false_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::False;
};
const auto set_steps = [this](const StepsT steps)
{
parameters.steps = steps;
};
const auto set_timestamps = [this](TimestampsT timestamps)
{
const auto set_steps = [this](const StepsT steps) { parameters.steps = steps; };
const auto set_timestamps = [this](TimestampsT timestamps) {
parameters.timestamps = std::move(timestamps);
};
@ -70,8 +62,8 @@ struct MatchParametersGrammar final : public BaseParametersGrammar
timestamps_rule = qi::lit("timestamps=") >> qi::uint_ % ";";
match_rule = steps_rule[set_steps] | geometries_rule | overview_rule |
timestamps_rule[set_timestamps];
root_rule =
query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (match_rule | base_rule) % '&');
root_rule = query_rule >> -qi::lit(".") >> -qi::lit("json") >>
-(qi::lit("?") >> (match_rule | base_rule) % '&');
}
engine::api::MatchParameters parameters;

View File

@ -3,13 +3,14 @@
#include "engine/api/nearest_parameters.hpp"
//#define BOOST_SPIRIT_DEBUG
#include "server/api/base_parameters_grammar.hpp"
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_uint.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_optional.hpp>
#include <boost/spirit/include/qi_uint.hpp>
namespace osrm
{
@ -26,13 +27,12 @@ struct NearestParametersGrammar final : public BaseParametersGrammar
NearestParametersGrammar() : BaseParametersGrammar(root_rule, parameters)
{
const auto set_number = [this](const unsigned number)
{
const auto set_number = [this](const unsigned number) {
parameters.number_of_results = number;
};
nearest_rule = (qi::lit("number=") >> qi::uint_)[set_number];
root_rule =
query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (nearest_rule | base_rule) % '&');
root_rule = query_rule >> -qi::lit(".") >> -qi::lit("json") >>
-(qi::lit("?") >> (nearest_rule | base_rule) % '&');
}
engine::api::NearestParameters parameters;

View File

@ -3,12 +3,13 @@
#include "engine/api/route_parameters.hpp"
//#define BOOST_SPIRIT_DEBUG
#include "server/api/base_parameters_grammar.hpp"
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_bool.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_optional.hpp>
namespace osrm
@ -31,39 +32,27 @@ struct RouteParametersGrammar : public BaseParametersGrammar
RouteParametersGrammar() : BaseParametersGrammar(root_rule, parameters)
{
const auto set_geojson_type = [this]()
{
const auto set_geojson_type = [this] {
parameters.geometries = engine::api::RouteParameters::GeometriesType::GeoJSON;
};
const auto set_polyline_type = [this]()
{
const auto set_polyline_type = [this] {
parameters.geometries = engine::api::RouteParameters::GeometriesType::Polyline;
};
const auto set_simplified_type = [this]()
{
const auto set_simplified_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::Simplified;
};
const auto set_full_type = [this]()
{
const auto set_full_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::Full;
};
const auto set_false_type = [this]()
{
const auto set_false_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::False;
};
const auto set_steps = [this](const StepsT steps)
{
parameters.steps = steps;
};
const auto set_alternatives = [this](const AlternativeT alternatives)
{
const auto set_steps = [this](const StepsT steps) { parameters.steps = steps; };
const auto set_alternatives = [this](const AlternativeT alternatives) {
parameters.alternatives = alternatives;
};
const auto set_uturns = [this](UturnsT uturns)
{
parameters.uturns = std::move(uturns);
};
const auto set_uturns = [this](UturnsT uturns) { parameters.uturns = std::move(uturns); };
alternatives_rule = qi::lit("alternatives=") >> qi::bool_;
steps_rule = qi::lit("steps=") >> qi::bool_;
@ -76,8 +65,8 @@ struct RouteParametersGrammar : public BaseParametersGrammar
route_rule = steps_rule[set_steps] | alternatives_rule[set_alternatives] | geometries_rule |
overview_rule | uturns_rule;
root_rule =
query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (route_rule | base_rule) % '&');
root_rule = query_rule >> -qi::lit(".") >> -qi::lit("json") >>
-(qi::lit("?") >> (route_rule | base_rule) % '&');
}
engine::api::RouteParameters parameters;

View File

@ -3,13 +3,14 @@
#include "engine/api/table_parameters.hpp"
//#define BOOST_SPIRIT_DEBUG
#include "server/api/base_parameters_grammar.hpp"
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_uint.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_optional.hpp>
#include <boost/spirit/include/qi_uint.hpp>
namespace osrm
{
@ -28,12 +29,10 @@ struct TableParametersGrammar final : public BaseParametersGrammar
TableParametersGrammar() : BaseParametersGrammar(root_rule, parameters)
{
const auto set_destiantions = [this](DestinationsT dests)
{
const auto set_destiantions = [this](DestinationsT dests) {
parameters.destinations = std::move(dests);
};
const auto set_sources = [this](SourcesT sources)
{
const auto set_sources = [this](SourcesT sources) {
parameters.sources = std::move(sources);
};
destinations_rule = (qi::lit("destinations=") >> (qi::ulong_ % ";")[set_destiantions]) |
@ -42,8 +41,8 @@ struct TableParametersGrammar final : public BaseParametersGrammar
(qi::lit("sources=") >> (qi::ulong_ % ";")[set_sources]) | qi::lit("sources=all");
table_rule = destinations_rule | sources_rule;
root_rule =
query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (table_rule | base_rule) % '&');
root_rule = query_rule >> -qi::lit(".") >> -qi::lit("json") >>
-(qi::lit("?") >> (table_rule | base_rule) % '&');
}
engine::api::TableParameters parameters;

View File

@ -3,14 +3,15 @@
#include "engine/api/trip_parameters.hpp"
//#define BOOST_SPIRIT_DEBUG
#include "server/api/base_parameters_grammar.hpp"
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_uint.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_bool.hpp>
#include <boost/spirit/include/qi_grammar.hpp>
#include <boost/spirit/include/qi_action.hpp>
#include <boost/spirit/include/qi_lit.hpp>
#include <boost/spirit/include/qi_optional.hpp>
#include <boost/spirit/include/qi_uint.hpp>
namespace osrm
{
@ -30,31 +31,23 @@ struct TripParametersGrammar final : public BaseParametersGrammar
TripParametersGrammar() : BaseParametersGrammar(root_rule, parameters)
{
const auto set_geojson_type = [this]()
{
const auto set_geojson_type = [this] {
parameters.geometries = engine::api::RouteParameters::GeometriesType::GeoJSON;
};
const auto set_polyline_type = [this]()
{
const auto set_polyline_type = [this] {
parameters.geometries = engine::api::RouteParameters::GeometriesType::Polyline;
};
const auto set_simplified_type = [this]()
{
const auto set_simplified_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::Simplified;
};
const auto set_full_type = [this]()
{
const auto set_full_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::Full;
};
const auto set_false_type = [this]()
{
const auto set_false_type = [this] {
parameters.overview = engine::api::RouteParameters::OverviewType::False;
};
const auto set_steps = [this](const StepsT steps)
{
parameters.steps = steps;
};
const auto set_steps = [this](const StepsT steps) { parameters.steps = steps; };
steps_rule = qi::lit("steps=") >> qi::bool_;
geometries_rule = qi::lit("geometries=geojson")[set_geojson_type] |
@ -64,8 +57,8 @@ struct TripParametersGrammar final : public BaseParametersGrammar
qi::lit("overview=false")[set_false_type];
trip_rule = steps_rule[set_steps] | geometries_rule | overview_rule;
root_rule =
query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (trip_rule | base_rule) % '&');
root_rule = query_rule >> -qi::lit(".") >> -qi::lit("json") >>
-(qi::lit("?") >> (trip_rule | base_rule) % '&');
}
engine::api::TripParameters parameters;