|
21 | 21 |
|
22 | 22 | #include <cstdio> |
23 | 23 | #include <memory> |
| 24 | +#include <rcpputils/scope_exit.hpp> |
| 25 | +// NOLINTNEXTLINE |
24 | 26 | #include <string> |
25 | 27 |
|
26 | 28 | namespace { |
@@ -344,9 +346,51 @@ void FreeArgs(char** argv, size_t argc) { |
344 | 346 | } |
345 | 347 | } |
346 | 348 |
|
347 | | -bool HasUnparsedROSArgs(const rcl_arguments_t& rcl_args) { |
| 349 | +void ThrowIfUnparsedROSArgs(Napi::Env env, const Napi::Array& jsArgv, |
| 350 | + const rcl_arguments_t& rcl_args) { |
348 | 351 | int unparsed_ros_args_count = rcl_arguments_get_count_unparsed_ros(&rcl_args); |
349 | | - return unparsed_ros_args_count != 0; |
| 352 | + |
| 353 | + if (unparsed_ros_args_count < 0) { |
| 354 | + Napi::Error::New(env, "Failed to count unparsed arguments") |
| 355 | + .ThrowAsJavaScriptException(); |
| 356 | + return; |
| 357 | + } |
| 358 | + if (0 == unparsed_ros_args_count) { |
| 359 | + return; |
| 360 | + } |
| 361 | + |
| 362 | + rcl_allocator_t allocator = rcl_get_default_allocator(); |
| 363 | + int* unparsed_indices_c = nullptr; |
| 364 | + rcl_ret_t ret = |
| 365 | + rcl_arguments_get_unparsed_ros(&rcl_args, allocator, &unparsed_indices_c); |
| 366 | + if (RCL_RET_OK != ret) { |
| 367 | + Napi::Error::New(env, "Failed to get unparsed arguments") |
| 368 | + .ThrowAsJavaScriptException(); |
| 369 | + return; |
| 370 | + } |
| 371 | + |
| 372 | + RCPPUTILS_SCOPE_EXIT({ |
| 373 | + allocator.deallocate(unparsed_indices_c, allocator.state); |
| 374 | + }); |
| 375 | + |
| 376 | + std::string unparsed_args_str = "["; |
| 377 | + for (int i = 0; i < unparsed_ros_args_count; ++i) { |
| 378 | + int index = unparsed_indices_c[i]; |
| 379 | + if (index < 0 || static_cast<size_t>(index) >= jsArgv.Length()) { |
| 380 | + Napi::Error::New(env, "Got invalid unparsed ROS arg index") |
| 381 | + .ThrowAsJavaScriptException(); |
| 382 | + return; |
| 383 | + } |
| 384 | + std::string arg = jsArgv.Get(index).As<Napi::String>().Utf8Value(); |
| 385 | + unparsed_args_str += "'" + arg + "'"; |
| 386 | + if (i < unparsed_ros_args_count - 1) { |
| 387 | + unparsed_args_str += ", "; |
| 388 | + } |
| 389 | + } |
| 390 | + unparsed_args_str += "]"; |
| 391 | + |
| 392 | + Napi::Error::New(env, "Unknown ROS arguments: " + unparsed_args_str) |
| 393 | + .ThrowAsJavaScriptException(); |
350 | 394 | } |
351 | 395 |
|
352 | 396 | } // namespace rclnodejs |
0 commit comments