#ifndef ROUTE_PARAMETERS_GRAMMAR_HPP #define ROUTE_PARAMETERS_GRAMMAR_HPP #include "engine/api/route_parameters.hpp" #include "server/api/base_parameters_grammar.hpp" #include #include #include #include #include namespace osrm { namespace server { namespace api { namespace qi = boost::spirit::qi; struct RouteParametersGrammar : public BaseParametersGrammar { using Iterator = std::string::iterator; using StepsT = bool; using AlternativeT = bool; using GeometriesT = engine::api::RouteParameters::GeometriesType; using OverviewT = engine::api::RouteParameters::OverviewType; using UturnsT = std::vector>; RouteParametersGrammar() : BaseParametersGrammar(root_rule, parameters) { const auto set_geojson_type = [this]() { parameters.geometries = engine::api::RouteParameters::GeometriesType::GeoJSON; }; const auto set_polyline_type = [this]() { parameters.geometries = engine::api::RouteParameters::GeometriesType::Polyline; }; const auto set_simplified_type = [this]() { parameters.overview = engine::api::RouteParameters::OverviewType::Simplified; }; const auto set_full_type = [this]() { parameters.overview = engine::api::RouteParameters::OverviewType::Full; }; 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_alternative = [this](const AlternativeT alternative) { parameters.alternative = alternative; }; const auto set_uturns = [this](UturnsT &uturns) { parameters.uturns = std::move(uturns); }; alternative_rule = qi::lit("alternative=") >> qi::bool_; steps_rule = qi::lit("steps=") >> qi::bool_; geometries_rule = qi::lit("geometries=geojson")[set_geojson_type] | qi::lit("geometries=polyline")[set_polyline_type]; overview_rule = qi::lit("overview=simplified")[set_simplified_type] | qi::lit("overview=full")[set_full_type] | qi::lit("overview=false")[set_false_type]; uturns_rule = qi::lit("uturns=") >> -qi::bool_ % ";"; route_rule = steps_rule[set_steps] | alternative_rule[set_alternative] | geometries_rule | overview_rule | uturns_rule[set_uturns]; root_rule = query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (route_rule | base_rule) % '&'); } engine::api::RouteParameters parameters; private: qi::rule root_rule; qi::rule route_rule, geometries_rule, overview_rule; qi::rule uturns_rule; qi::rule steps_rule; qi::rule alternative_rule; }; } } } #endif