From 924b1f13389b1239b4d0950e7d8c32aaab0d3d80 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 14 Mar 2025 18:01:38 +0100 Subject: [PATCH 1/3] Add convenience function --- include/argparse.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/argparse.h b/include/argparse.h index 72d346fb..091b3d44 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -632,6 +632,8 @@ namespace argparse } protected: + virtual auto get_name_for_error() const -> std::string = 0; + auto check_choices(std::any const & value) const -> void { if (m_options.choices.empty()) @@ -822,6 +824,11 @@ namespace argparse return result; } + auto get_name_for_error() const -> std::string override + { + return get_dest_name(); + } + private: std::any m_value; }; @@ -1145,6 +1152,11 @@ namespace argparse return m_options.names.front().substr(1); } + auto get_name_for_error() const -> std::string override + { + return join(get_names(), "/"); + } + private: std::any m_value; bool m_present; From cb2936bda8f2bdb390aff5115e62c2f6fc3114de Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 14 Mar 2025 18:14:16 +0100 Subject: [PATCH 2/3] Use the function --- include/argparse.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 091b3d44..9442a255 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -805,7 +805,7 @@ namespace argparse std::any value; if (!m_options.type_handler->from_string(arg, value)) { - throw parsing_error(std::format("argument {}: invalid value: '{}'", get_dest_name(), arg)); + throw parsing_error(std::format("argument {}: invalid value: '{}'", get_name_for_error(), arg)); } check_choices(value); return value; @@ -1120,7 +1120,7 @@ namespace argparse std::any value; if (!m_options.type_handler->from_string(arg, value)) { - throw parsing_error(std::format("argument {}: invalid value: '{}'", join(get_names(), "/"), arg)); + throw parsing_error(std::format("argument {}: invalid value: '{}'", get_name_for_error(), arg)); } check_choices(value); return value; From 4bc7febdd357cd5e32e5c15e5a74369cad44ac23 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 14 Mar 2025 18:16:49 +0100 Subject: [PATCH 3/3] Extract common code to base class --- include/argparse.h | 90 ++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 60 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 9442a255..2fd79127 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -634,6 +634,36 @@ namespace argparse protected: virtual auto get_name_for_error() const -> std::string = 0; + auto consume_arg(Token & arg) const -> std::any + { + arg.m_consumed = true; + return process_arg(arg.m_token); + } + + auto process_arg(std::string const & arg) const -> std::any + { + std::any value; + if (!m_options.type_handler->from_string(arg, value)) + { + throw parsing_error(std::format("argument {}: invalid value: '{}'", get_name_for_error(), arg)); + } + check_choices(value); + return value; + } + + auto consume_args(std::ranges::view auto args) const -> std::vector + { + auto result = std::vector(); + auto consumed = std::vector(); + for (auto & arg : args) + { + result.push_back(process_arg(arg.m_token)); + consumed.push_back(&arg); + } + std::ranges::for_each(consumed, [](auto arg) { arg->m_consumed = true; }); + return result; + } + auto check_choices(std::any const & value) const -> void { if (m_options.choices.empty()) @@ -794,36 +824,6 @@ namespace argparse } } - auto consume_arg(Token & arg) const -> std::any - { - arg.m_consumed = true; - return process_arg(arg.m_token); - } - - auto process_arg(std::string const & arg) const -> std::any - { - std::any value; - if (!m_options.type_handler->from_string(arg, value)) - { - throw parsing_error(std::format("argument {}: invalid value: '{}'", get_name_for_error(), arg)); - } - check_choices(value); - return value; - } - - auto consume_args(std::ranges::view auto args) const -> std::vector - { - auto result = std::vector(); - auto consumed = std::vector(); - for (auto & arg : args) - { - result.push_back(process_arg(arg.m_token)); - consumed.push_back(&arg); - } - std::ranges::for_each(consumed, [](auto arg) { arg->m_consumed = true; }); - return result; - } - auto get_name_for_error() const -> std::string override { return get_dest_name(); @@ -1109,36 +1109,6 @@ namespace argparse } } - auto consume_arg(Token & arg) const -> std::any - { - arg.m_consumed = true; - return process_arg(arg.m_token); - } - - auto process_arg(std::string const & arg) const -> std::any - { - std::any value; - if (!m_options.type_handler->from_string(arg, value)) - { - throw parsing_error(std::format("argument {}: invalid value: '{}'", get_name_for_error(), arg)); - } - check_choices(value); - return value; - } - - auto consume_args(std::ranges::view auto args) const -> std::vector - { - auto result = std::vector(); - auto consumed = std::vector(); - for (auto & arg : args) - { - result.push_back(process_arg(arg.m_token)); - consumed.push_back(&arg); - } - std::ranges::for_each(consumed, [](auto arg) { arg->m_consumed = true; }); - return result; - } - auto get_name_for_dest() const -> std::string { for (auto const & name : m_options.names)