From 3ae1ab2e39aeddeaddf8c802f7d6867914a2b570 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Wed, 3 Dec 2025 20:02:48 +0100 Subject: [PATCH 1/5] Extract code to separate function --- include/argparse.hpp | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index faf1d74..37615e7 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1899,6 +1899,11 @@ namespace argparse ~ArgumentBuilder() noexcept(false) { + if (m_options.mutually_exclusive_group != nullptr && !is_allowed_in_mutually_exclusive_group()) + { + throw option_error("mutually exclusive arguments must be optional"); + } + if ((m_options.action == argparse::version) && m_options.help.empty()) { m_options.help = "show program's version number and exit"; @@ -1906,25 +1911,10 @@ namespace argparse if (is_positional()) { - if (m_options.mutually_exclusive_group != nullptr - && (!m_options.nargs.has_value() - || (!std::holds_alternative(*m_options.nargs) - || (std::get(*m_options.nargs) != zero_or_one - && std::get(*m_options.nargs) != zero_or_more)))) - { - throw option_error("mutually exclusive arguments must be optional"); - } - m_arguments.emplace_back(PositionalArgument(std::move(m_options))); } else { - if (m_options.mutually_exclusive_group != nullptr - && m_options.required) - { - throw option_error("mutually exclusive arguments must be optional"); - } - m_arguments.emplace_back(OptionalArgument(std::move(m_options))); } } @@ -2025,6 +2015,29 @@ namespace argparse return !m_options.names.front().starts_with('-'); } + auto is_allowed_in_mutually_exclusive_group() const -> bool + { + if (is_positional()) + { + if (m_options.nargs.has_value() && + std::holds_alternative(*m_options.nargs) && + (std::get(*m_options.nargs) == zero_or_one || + std::get(*m_options.nargs) == zero_or_more)) + { + return true; + } + } + else + { + if (!m_options.required) + { + return true; + } + } + + return false; + } + private: Arguments & m_arguments; OptString & m_version; From f6c219678f21e05628af74bdb31d6169e482648a Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Wed, 3 Dec 2025 20:04:34 +0100 Subject: [PATCH 2/5] Extract code to separate function --- include/argparse.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 37615e7..b9edbb9 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1899,7 +1899,7 @@ namespace argparse ~ArgumentBuilder() noexcept(false) { - if (m_options.mutually_exclusive_group != nullptr && !is_allowed_in_mutually_exclusive_group()) + if (is_mutually_exclusive() && !is_allowed_in_mutually_exclusive_group()) { throw option_error("mutually exclusive arguments must be optional"); } @@ -2015,6 +2015,11 @@ namespace argparse return !m_options.names.front().starts_with('-'); } + auto is_mutually_exclusive() const -> bool + { + return m_options.mutually_exclusive_group != nullptr; + } + auto is_allowed_in_mutually_exclusive_group() const -> bool { if (is_positional()) From 3e3a024716497b92f2cef798ccb16a8ac83b8658 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Wed, 3 Dec 2025 20:06:05 +0100 Subject: [PATCH 3/5] Simplify code --- include/argparse.hpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index b9edbb9..cf9ef02 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -2034,10 +2034,7 @@ namespace argparse } else { - if (!m_options.required) - { - return true; - } + return !m_options.required; } return false; From bbfe35beb1212b941b8038850aee4676d8bbec78 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Wed, 3 Dec 2025 20:09:21 +0100 Subject: [PATCH 4/5] Simplify code --- include/argparse.hpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index cf9ef02..ad82a5a 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -2024,20 +2024,15 @@ namespace argparse { if (is_positional()) { - if (m_options.nargs.has_value() && + return (m_options.nargs.has_value() && std::holds_alternative(*m_options.nargs) && (std::get(*m_options.nargs) == zero_or_one || - std::get(*m_options.nargs) == zero_or_more)) - { - return true; - } + std::get(*m_options.nargs) == zero_or_more)); } else { return !m_options.required; } - - return false; } private: From cf38a8229fbfeb3c1178542a5ea0e9ca2958b155 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Wed, 3 Dec 2025 20:12:22 +0100 Subject: [PATCH 5/5] Extract code to separate function --- include/argparse.hpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index ad82a5a..560aaaa 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -2024,10 +2024,7 @@ namespace argparse { if (is_positional()) { - return (m_options.nargs.has_value() && - std::holds_alternative(*m_options.nargs) && - (std::get(*m_options.nargs) == zero_or_one || - std::get(*m_options.nargs) == zero_or_more)); + return is_optional_by_nargs_option(); } else { @@ -2035,6 +2032,23 @@ namespace argparse } } + auto is_optional_by_nargs_option() const -> bool + { + if (!m_options.nargs.has_value()) + { + return false; + } + + if (!std::holds_alternative(*m_options.nargs)) + { + return false; + } + + auto const nargs = std::get(*m_options.nargs); + + return nargs == zero_or_one || nargs == zero_or_more; + } + private: Arguments & m_arguments; OptString & m_version;