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

View File

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

View File

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

View File

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

View File

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