From 58061a68c4523ca1dd69acd70d68ce8c9a3b4072 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Thu, 20 Jul 2017 23:54:26 +0000 Subject: [PATCH] Add avoid parameter to the API --- include/engine/api/route_parameters.hpp | 19 +++++++++++++++++- .../server/api/route_parameters_grammar.hpp | 6 +++++- unit_tests/server/parameters_parser.cpp | 20 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/include/engine/api/route_parameters.hpp b/include/engine/api/route_parameters.hpp index 9b2003124..895cb4810 100644 --- a/include/engine/api/route_parameters.hpp +++ b/include/engine/api/route_parameters.hpp @@ -81,6 +81,23 @@ struct RouteParameters : public BaseParameters RouteParameters() = default; + template + RouteParameters(const bool steps_, + const bool alternatives_, + const GeometriesType geometries_, + const OverviewType overview_, + const boost::optional continue_straight_, + std::vector avoid_, + Args... args_) + : BaseParameters{std::forward(args_)...}, steps{steps_}, alternatives{alternatives_}, + number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{false}, + annotations_type{AnnotationsType::None}, geometries{geometries_}, overview{overview_}, + continue_straight{continue_straight_}, avoid{std::move(avoid_)} + // Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one below. + { + } + + // Without avoid flags template RouteParameters(const bool steps_, const bool alternatives_, @@ -92,7 +109,6 @@ struct RouteParameters : public BaseParameters number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{false}, annotations_type{AnnotationsType::None}, geometries{geometries_}, overview{overview_}, continue_straight{continue_straight_} - // Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one below. { } @@ -138,6 +154,7 @@ struct RouteParameters : public BaseParameters GeometriesType geometries = GeometriesType::Polyline; OverviewType overview = OverviewType::Simplified; boost::optional continue_straight; + std::vector avoid; bool IsValid() const { diff --git a/include/server/api/route_parameters_grammar.hpp b/include/server/api/route_parameters_grammar.hpp index 2572532c9..41bbf725b 100644 --- a/include/server/api/route_parameters_grammar.hpp +++ b/include/server/api/route_parameters_grammar.hpp @@ -70,6 +70,8 @@ struct RouteParametersGrammar : public BaseParametersGrammar (qi::as_string[+qi::char_("a-zA-Z")] % ','); + base_rule = BaseGrammar::base_rule(qi::_r1) | (qi::lit("steps=") > @@ -82,7 +84,8 @@ struct RouteParametersGrammar : public BaseParametersGrammar root_rule; qi::rule route_rule; + qi::rule()> avoid_rule; qi::symbols geometries_type; qi::symbols overview_type; diff --git a/unit_tests/server/parameters_parser.cpp b/unit_tests/server/parameters_parser.cpp index 39f026082..3c68f5b80 100644 --- a/unit_tests/server/parameters_parser.cpp +++ b/unit_tests/server/parameters_parser.cpp @@ -471,6 +471,26 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) CHECK_EQUAL_RANGE(reference_20.approaches, result_20->approaches); CHECK_EQUAL_RANGE(reference_20.coordinates, result_20->coordinates); CHECK_EQUAL_RANGE(reference_20.hints, result_20->hints); + + // avoid flags + RouteParameters reference_21{}; + reference_21.avoid = {"ferry", "motorway"}; + reference_21.coordinates = coords_1; + auto result_21 = parseParameters("1,2;3,4?avoid=ferry,motorway"); + BOOST_CHECK(result_21); + BOOST_CHECK_EQUAL(reference_21.steps, result_21->steps); + BOOST_CHECK_EQUAL(reference_21.alternatives, result_21->alternatives); + BOOST_CHECK_EQUAL(reference_21.number_of_alternatives, result_21->number_of_alternatives); + BOOST_CHECK_EQUAL(reference_21.geometries, result_21->geometries); + BOOST_CHECK_EQUAL(reference_21.annotations, result_21->annotations); + BOOST_CHECK_EQUAL(reference_21.overview, result_21->overview); + BOOST_CHECK_EQUAL(reference_21.continue_straight, result_21->continue_straight); + CHECK_EQUAL_RANGE(reference_21.bearings, result_21->bearings); + CHECK_EQUAL_RANGE(reference_21.radiuses, result_21->radiuses); + CHECK_EQUAL_RANGE(reference_21.approaches, result_21->approaches); + CHECK_EQUAL_RANGE(reference_21.coordinates, result_21->coordinates); + CHECK_EQUAL_RANGE(reference_21.hints, result_21->hints); + CHECK_EQUAL_RANGE(reference_21.avoid, result_21->avoid); } BOOST_AUTO_TEST_CASE(valid_table_urls)