diff --git a/include/argparse.h b/include/argparse.h index 72d346fb..2fd79127 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -632,6 +632,38 @@ 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()) @@ -792,34 +824,9 @@ 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_dest_name(), arg)); - } - check_choices(value); - return value; - } - - auto consume_args(std::ranges::view auto args) const -> std::vector + auto get_name_for_error() const -> std::string override { - 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; + return get_dest_name(); } private: @@ -1102,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: '{}'", join(get_names(), "/"), 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) @@ -1145,6 +1122,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;