From 2640a319c1cff2610f8fcda7b6db4abf48560849 Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Sat, 17 Dec 2016 15:38:14 +0100 Subject: [PATCH] Wrap way.nodes() returned reference into sol::as_table --- features/options/extract/lua.feature | 28 +++++++++++++++++++++ src/extractor/scripting_environment_lua.cpp | 27 +++++++++----------- 2 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 features/options/extract/lua.feature diff --git a/features/options/extract/lua.feature b/features/options/extract/lua.feature new file mode 100644 index 00000000000..b1c74b07fc6 --- /dev/null +++ b/features/options/extract/lua.feature @@ -0,0 +1,28 @@ +@extract +Feature: osrm-extract lua ways:get_nodes() + + Background: + Given the node map + """ + a b + """ + And the ways + | nodes | + | ab | + And the data has been saved to disk + + Scenario: osrm-extract - Passing base file + Given the profile file "testbot" extended with + """ + function way_function(way, result) + for _, node in ipairs(way:get_nodes()) do + print('node id ' .. node:id()) + end + result.forward_mode = mode.driving + result.forward_speed = 1 + end + """ + When I run "osrm-extract --profile {profile_file} {osm_file}" + Then it should exit successfully + And stdout should contain "node id 1" + And stdout should contain "node id 2" diff --git a/src/extractor/scripting_environment_lua.cpp b/src/extractor/scripting_environment_lua.cpp index cd5ce0c9512..f9923fa2f9d 100644 --- a/src/extractor/scripting_environment_lua.cpp +++ b/src/extractor/scripting_environment_lua.cpp @@ -74,8 +74,6 @@ template double lonToDouble(T const &object) return static_cast(util::toFloating(object.lon)); } -auto get_nodes_for_way(const osmium::Way &way) -> decltype(way.nodes()) { return way.nodes(); } - Sol2ScriptingEnvironment::Sol2ScriptingEnvironment(const std::string &file_name) : file_name(file_name) { @@ -184,13 +182,14 @@ void Sol2ScriptingEnvironment::InitContext(LuaScriptingContext &context) "valid", &osmium::Location::valid); - context.state.new_usertype("Way", - "get_value_by_key", - &get_value_by_key, - "id", - &osmium::Way::id, - "get_nodes", - &get_nodes_for_way); + context.state.new_usertype( + "Way", + "get_value_by_key", + &get_value_by_key, + "id", + &osmium::Way::id, + "get_nodes", + [](const osmium::Way &way) { return sol::as_table(way.nodes()); }); context.state.new_usertype("Node", "location", @@ -257,8 +256,6 @@ void Sol2ScriptingEnvironment::InitContext(LuaScriptingContext &context) "backward_mode", sol::property(&ExtractionWay::get_backward_mode, &ExtractionWay::set_backward_mode)); - context.state.new_usertype("WayNodeList"); - // Keep in mind .location is undefined since we're not using libosmium's location cache context.state.new_usertype("NodeRef", "id", &osmium::NodeRef::ref); @@ -308,12 +305,12 @@ void Sol2ScriptingEnvironment::InitContext(LuaScriptingContext &context) context.has_segment_function = segment_function.valid(); auto maybe_version = context.state.get>("api_version"); if (maybe_version) - { - context.api_version = *maybe_version; - } + { + context.api_version = *maybe_version; + } if (context.api_version < SUPPORTED_MIN_API_VERSION || - context.api_version > SUPPORTED_MAX_API_VERSION ) + context.api_version > SUPPORTED_MAX_API_VERSION) { throw util::exception("Invalid profile API version " + std::to_string(context.api_version) + " only versions from " + std::to_string(SUPPORTED_MIN_API_VERSION) +