diff --git a/src/headers/parser/parser_v2.hpp b/src/headers/parser/parser_v2.hpp index 99fcef1..3f64ca0 100644 --- a/src/headers/parser/parser_v2.hpp +++ b/src/headers/parser/parser_v2.hpp @@ -38,58 +38,7 @@ namespace argument_parser::v2 { template void add_argument(std::unordered_map> const &argument_pairs) { - std::unordered_map found_params{ - {extended_add_argument_flags::IsTyped, true}}; - - std::string short_arg, long_arg, help_text; - std::unique_ptr action; - bool required = false; - - if (argument_pairs.contains(add_argument_flags::ShortArgument)) { - found_params[extended_add_argument_flags::ShortArgument] = true; - short_arg = get_or_throw(argument_pairs.at(add_argument_flags::ShortArgument), "short"); - } - if (argument_pairs.contains(add_argument_flags::LongArgument)) { - found_params[extended_add_argument_flags::LongArgument] = true; - long_arg = get_or_throw(argument_pairs.at(add_argument_flags::LongArgument), "long"); - if (short_arg.empty()) - short_arg = long_arg; - } else { - if (!short_arg.empty()) - long_arg = short_arg; - } - - if (argument_pairs.contains(add_argument_flags::Action)) { - found_params[extended_add_argument_flags::Action] = true; - action = get_or_throw>(argument_pairs.at(add_argument_flags::Action), "action") - .clone(); - } - if (argument_pairs.contains(add_argument_flags::HelpText)) { - help_text = get_or_throw(argument_pairs.at(add_argument_flags::HelpText), "help"); - } else { - help_text = short_arg + ", " + long_arg; - } - if (argument_pairs.contains(add_argument_flags::Required) && - get_or_throw(argument_pairs.at(add_argument_flags::Required), "required")) { - required = true; - } - - auto suggested_add = suggest_candidate(found_params); - if (suggested_add == candidate_type::unknown) { - throw std::runtime_error("Could not match any add argument overload to given parameters. Are you " - "missing some required parameter?"); - } - switch (suggested_add) { - case candidate_type::typed_action: - base::add_argument(short_arg, long_arg, help_text, *static_cast *>(&(*action)), - required); - break; - case candidate_type::store_other: - base::add_argument(short_arg, long_arg, help_text, required); - break; - default: - throw std::runtime_error("Could not match the arguments against any overload."); - } + add_argument_impl>(argument_pairs); } template void add_argument(std::initializer_list> const &pairs) { @@ -113,61 +62,7 @@ namespace argument_parser::v2 { } void add_argument(std::unordered_map const &argument_pairs) { - std::unordered_map found_params{ - {extended_add_argument_flags::IsTyped, false}}; - - std::string short_arg, long_arg, help_text; - std::unique_ptr action; - bool required = false; - - if (argument_pairs.find(add_argument_flags::ShortArgument) != argument_pairs.end()) { - found_params[extended_add_argument_flags::ShortArgument] = true; - short_arg = get_or_throw(argument_pairs.at(add_argument_flags::ShortArgument), "short"); - } - if (argument_pairs.find(add_argument_flags::LongArgument) != argument_pairs.end()) { - found_params[extended_add_argument_flags::LongArgument] = true; - long_arg = get_or_throw(argument_pairs.at(add_argument_flags::LongArgument), "long"); - if (short_arg.empty()) - short_arg = long_arg; - } else { - if (!short_arg.empty()) - long_arg = short_arg; - } - if (argument_pairs.find(add_argument_flags::Action) != argument_pairs.end()) { - found_params[extended_add_argument_flags::Action] = true; - action = get_or_throw(argument_pairs.at(add_argument_flags::Action), "action") - .clone(); - } - if (argument_pairs.find(add_argument_flags::HelpText) != argument_pairs.end()) { - help_text = get_or_throw(argument_pairs.at(add_argument_flags::HelpText), "help"); - } else { - help_text = short_arg + ", " + long_arg; - } - - if (argument_pairs.find(add_argument_flags::Required) != argument_pairs.end() && - get_or_throw(argument_pairs.at(add_argument_flags::Required), "required")) { - required = true; - } - - auto suggested_add = suggest_candidate(found_params); - if (suggested_add == candidate_type::unknown) { - throw std::runtime_error("Could not match any add argument overload to given parameters. Are you " - "missing some required parameter?"); - } - - switch (suggested_add) { - case candidate_type::non_typed_action: - base::add_argument(short_arg, long_arg, help_text, *static_cast(&(*action)), - required); - break; - case candidate_type::store_boolean: - base::add_argument(short_arg, long_arg, help_text, required); - break; - default: - throw std::runtime_error( - "Could not match the arguments against any overload. The suggested candidate was: " + - std::to_string((int(suggested_add)))); - } + add_argument_impl(argument_pairs); } argument_parser::base_parser &to_v1() { @@ -196,6 +91,79 @@ namespace argument_parser::v2 { } private: + template + void add_argument_impl(ArgsMap const &argument_pairs) { + std::unordered_map found_params{ + {extended_add_argument_flags::IsTyped, IsTyped}}; + + std::string short_arg, long_arg, help_text; + std::unique_ptr action; + bool required = false; + + if (argument_pairs.find(add_argument_flags::ShortArgument) != argument_pairs.end()) { + found_params[extended_add_argument_flags::ShortArgument] = true; + short_arg = get_or_throw(argument_pairs.at(add_argument_flags::ShortArgument), "short"); + } + if (argument_pairs.find(add_argument_flags::LongArgument) != argument_pairs.end()) { + found_params[extended_add_argument_flags::LongArgument] = true; + long_arg = get_or_throw(argument_pairs.at(add_argument_flags::LongArgument), "long"); + if (short_arg.empty()) + short_arg = long_arg; + } else { + if (!short_arg.empty()) + long_arg = short_arg; + } + + if (argument_pairs.find(add_argument_flags::Action) != argument_pairs.end()) { + found_params[extended_add_argument_flags::Action] = true; + action = get_or_throw(argument_pairs.at(add_argument_flags::Action), "action").clone(); + } + if (argument_pairs.find(add_argument_flags::HelpText) != argument_pairs.end()) { + help_text = get_or_throw(argument_pairs.at(add_argument_flags::HelpText), "help"); + } else { + help_text = short_arg + ", " + long_arg; + } + + if (argument_pairs.find(add_argument_flags::Required) != argument_pairs.end() && + get_or_throw(argument_pairs.at(add_argument_flags::Required), "required")) { + required = true; + } + + auto suggested_add = suggest_candidate(found_params); + if (suggested_add == candidate_type::unknown) { + throw std::runtime_error("Could not match any add argument overload to given parameters. Are you " + "missing some required parameter?"); + } + + if constexpr (IsTyped) { + switch (suggested_add) { + case candidate_type::typed_action: + base::add_argument(short_arg, long_arg, help_text, *static_cast(&(*action)), + required); + break; + case candidate_type::store_other: + base::add_argument(short_arg, long_arg, help_text, required); + break; + default: + throw std::runtime_error("Could not match the arguments against any overload."); + } + } else { + switch (suggested_add) { + case candidate_type::non_typed_action: + base::add_argument(short_arg, long_arg, help_text, *static_cast(&(*action)), + required); + break; + case candidate_type::store_boolean: + base::add_argument(short_arg, long_arg, help_text, required); + break; + default: + throw std::runtime_error( + "Could not match the arguments against any overload. The suggested candidate was: " + + std::to_string((int(suggested_add)))); + } + } + } + using base = argument_parser::base_parser; enum class extended_add_argument_flags { ShortArgument, LongArgument, Action, IsTyped };