Add argument name after 'Too few arguments' error

If a non-positional argument doesn't get the number of required values,
a generic "Too few arguments" error is generated, without its name, when
it is not the last argument (but if it is the last argument, we get its
name)
This commit is contained in:
Even Rouault 2024-05-27 19:21:23 +02:00
parent eab1d75e49
commit 84b7b46ce5
No known key found for this signature in database
GPG Key ID: 33EBBFC47B3DD87D
2 changed files with 11 additions and 1 deletions

View File

@ -997,7 +997,8 @@ public:
std::bind(is_optional, std::placeholders::_1, m_prefix_chars)); std::bind(is_optional, std::placeholders::_1, m_prefix_chars));
dist = static_cast<std::size_t>(std::distance(start, end)); dist = static_cast<std::size_t>(std::distance(start, end));
if (dist < num_args_min) { if (dist < num_args_min) {
throw std::runtime_error("Too few arguments"); throw std::runtime_error("Too few arguments for '" +
std::string(m_used_name) + "'.");
} }
} }

View File

@ -17,6 +17,15 @@ TEST_CASE("Missing argument" * test_suite("parse_args")) {
std::runtime_error); std::runtime_error);
} }
TEST_CASE("Missing argument, not last" * test_suite("parse_args")) {
argparse::ArgumentParser program("test");
program.add_argument("--config").nargs(1);
program.add_argument("--foo");
REQUIRE_THROWS_WITH_AS(program.parse_args({"test", "--config", "--foo"}),
"Too few arguments for '--config'.",
std::runtime_error);
}
TEST_CASE("Parse a string argument with value" * test_suite("parse_args")) { TEST_CASE("Parse a string argument with value" * test_suite("parse_args")) {
argparse::ArgumentParser program("test"); argparse::ArgumentParser program("test");
program.add_argument("--config"); program.add_argument("--config");