From 41009046f2f447d9f46710a0b9441d3787f4d9e8 Mon Sep 17 00:00:00 2001 From: Pranav Srinivas Kumar Date: Sat, 30 Mar 2019 21:50:35 -0400 Subject: [PATCH] Added support for parsing optional arguments _while_ parsing some other variable length positional argument --- src/argparse.hpp | 7 ++++++- tests/test_positional_arguments.hpp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/argparse.hpp b/src/argparse.hpp index 9833363..8c0e426 100644 --- a/src/argparse.hpp +++ b/src/argparse.hpp @@ -216,8 +216,13 @@ class ArgumentParser { // This is a positional argument. // Parse and save into mPositionalArguments vector auto tArgument = mPositionalArguments[mNextPositionalArgument]; - auto tCount = tArgument->mNumArgs; + auto tCount = tArgument->mNumArgs - tArgument->mRawValues.size(); while (tCount > 0) { + std::map>::iterator tIterator = mArgumentMap.find(argv[i]); + if (tIterator != mArgumentMap.end()) { + i = i - 1; + break; + } if (i < argc) { tArgument->mRawValues.push_back(argv[i]); if (tArgument->mAction != nullptr) diff --git a/tests/test_positional_arguments.hpp b/tests/test_positional_arguments.hpp index 4eeea94..6b110b6 100644 --- a/tests/test_positional_arguments.hpp +++ b/tests/test_positional_arguments.hpp @@ -42,4 +42,21 @@ TEST_CASE("Parse positional arguments with optional arguments", "[parse_args]") REQUIRE(outputs.size() == 2); REQUIRE(outputs[0] == "thrust_profile.csv"); REQUIRE(outputs[1] == "output.mesh"); +} + +TEST_CASE("Parse positional arguments with optional arguments in the middle", "[parse_args]") { + argparse::ArgumentParser program("test"); + program.add_argument("input"); + program.add_argument("output").nargs(2); + program.add_argument("--num_iterations") + .action([](const std::string& value) { return std::stoi(value); }); + program.parse_args({ "test", "rocket.mesh", "thrust_profile.csv", "--num_iterations", "15", "output.mesh" }); + auto arguments = program.get_arguments(); + REQUIRE(arguments.size() == 3); + REQUIRE(program.get("--num_iterations") == 15); + REQUIRE(program.get("input") == "rocket.mesh"); + auto outputs = program.get>("output"); + REQUIRE(outputs.size() == 2); + REQUIRE(outputs[0] == "thrust_profile.csv"); + REQUIRE(outputs[1] == "output.mesh"); } \ No newline at end of file