diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bcbf72..a5c1d2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ options. The project adheres to semantic versioning. ### Added * Iterator inputs to `parse_positional`. +* Throw an exception if the option in `parse_positional` doesn't exist. ### Bug Fixes diff --git a/include/cxxopts.hpp b/include/cxxopts.hpp index 457cb68..5b7b37d 100644 --- a/include/cxxopts.hpp +++ b/include/cxxopts.hpp @@ -1659,6 +1659,10 @@ ParseResult::consume_positional(std::string a) return true; } } + else + { + throw option_not_exists_exception(*m_next_positional); + } ++m_next_positional; } diff --git a/test/options.cpp b/test/options.cpp index 1c02053..9bca88d 100644 --- a/test/options.cpp +++ b/test/options.cpp @@ -216,6 +216,22 @@ TEST_CASE("No positional with extras", "[positional]") CHECK(argv[1] == std::string("a")); } +TEST_CASE("Positional not valid", "[positional]") { + cxxopts::Options options("positional_invalid", "invalid positional argument"); + options.add_options() + ("long", "a long option", cxxopts::value()) + ; + + options.parse_positional("something"); + + Argv av({"foobar", "bar", "baz"}); + + char** argv = av.argv(); + auto argc = av.argc(); + + CHECK_THROWS_AS(options.parse(argc, argv), cxxopts::option_not_exists_exception); +} + TEST_CASE("Empty with implicit value", "[implicit]") { cxxopts::Options options("empty_implicit", "doesn't handle empty");