Skip to content

Commit 5341fc7

Browse files
authored
Merge pull request #187 from kkarbowiak/ban-mutually-exclusive-positionals
Ban mutually exclusive positional arguments
2 parents 09a9199 + 5da0db8 commit 5341fc7

2 files changed

Lines changed: 27 additions & 1 deletion

File tree

include/argparse.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1897,7 +1897,7 @@ namespace argparse
18971897
m_options.mutually_exclusive_group = group;
18981898
}
18991899

1900-
~ArgumentBuilder()
1900+
~ArgumentBuilder() noexcept(false)
19011901
{
19021902
if ((m_options.action == argparse::version) && m_options.help.empty())
19031903
{
@@ -1906,6 +1906,15 @@ namespace argparse
19061906

19071907
if (is_positional())
19081908
{
1909+
if (m_options.mutually_exclusive_group != nullptr
1910+
&& (!m_options.nargs.has_value()
1911+
|| (!std::holds_alternative<Nargs>(*m_options.nargs)
1912+
|| (std::get<Nargs>(*m_options.nargs) != zero_or_one
1913+
&& std::get<Nargs>(*m_options.nargs) != zero_or_more))))
1914+
{
1915+
throw option_error("mutually exclusive arguments must be optional");
1916+
}
1917+
19091918
m_arguments.emplace_back(PositionalArgument(std::move(m_options)));
19101919
}
19111920
else

test/unittest/test_argument_parser.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,23 @@ TEST_CASE("ArgumentParser supports mutually exclusive groups")
350350
CHECK_NOTHROW(parser.add_mutually_exclusive_group());
351351
}
352352

353+
TEST_CASE("Adding a positional argument to a mutually exclusive group results in error")
354+
{
355+
auto parser = argparse::ArgumentParser();
356+
auto group = parser.add_mutually_exclusive_group();
357+
358+
CHECK_THROWS_WITH_AS(group.add_argument("pos"), "mutually exclusive arguments must be optional", argparse::option_error);
359+
}
360+
361+
TEST_CASE("Adding a non-required positional argument to a mutually exclusive group does not result in error")
362+
{
363+
auto parser = argparse::ArgumentParser();
364+
auto group = parser.add_mutually_exclusive_group();
365+
366+
CHECK_NOTHROW(group.add_argument("pos").nargs(argparse::zero_or_one));
367+
CHECK_NOTHROW(group.add_argument("pos").nargs(argparse::zero_or_more));
368+
}
369+
353370
TEST_CASE("Adding an optional argument to a mutually exclusive group does not result in error")
354371
{
355372
auto parser = argparse::ArgumentParser();

0 commit comments

Comments
 (0)