diff --git a/include/CLI/App.hpp b/include/CLI/App.hpp index a287536e..085209d4 100644 --- a/include/CLI/App.hpp +++ b/include/CLI/App.hpp @@ -274,8 +274,6 @@ class App { std::string simple_name = CLI::detail::split(name, ',').at(0); CLI::callback_t fun = [&variable, simple_name](CLI::results_t res) { - if(res.size() != 1) - throw ConversionError("Only one " + simple_name + " allowed"); return detail::lexical_cast(res[0], variable); }; @@ -293,8 +291,6 @@ class App { std::string simple_name = CLI::detail::split(name, ',').at(0); CLI::callback_t fun = [&variable, simple_name](CLI::results_t res) { - if(res.size() != 1) - throw ConversionError("Only one " + simple_name + " allowed"); return detail::lexical_cast(res[0], variable); }; @@ -325,7 +321,7 @@ class App { }; Option *opt = add_option(name, fun, description, false); - opt->set_custom_option(detail::type_name(), -1, true); + opt->set_custom_option(detail::type_name(), -1); return opt; } @@ -347,7 +343,7 @@ class App { }; Option *opt = add_option(name, fun, description, defaulted); - opt->set_custom_option(detail::type_name(), -1, true); + opt->set_custom_option(detail::type_name(), -1); if(defaulted) opt->set_default_str("[" + detail::join(variable) + "]"); return opt; @@ -454,9 +450,6 @@ class App { std::string simple_name = CLI::detail::split(name, ',').at(0); CLI::callback_t fun = [&member, options, simple_name](CLI::results_t res) { - if(res.size() != 1) { - throw ConversionError("Only one " + simple_name + " allowed"); - } bool retval = detail::lexical_cast(res[0], member); if(!retval) throw ConversionError("The value " + res[0] + "is not an allowed value for " + simple_name); @@ -480,9 +473,6 @@ class App { std::string simple_name = CLI::detail::split(name, ',').at(0); CLI::callback_t fun = [&member, options, simple_name](CLI::results_t res) { - if(res.size() != 1) { - throw ConversionError("Only one " + simple_name + " allowed"); - } bool retval = detail::lexical_cast(res[0], member); if(!retval) throw ConversionError("The value " + res[0] + "is not an allowed value for " + simple_name); @@ -509,9 +499,6 @@ class App { std::string simple_name = CLI::detail::split(name, ',').at(0); CLI::callback_t fun = [&member, options, simple_name](CLI::results_t res) { - if(res.size() != 1) { - throw ConversionError("Only one " + simple_name + " allowed"); - } member = detail::to_lower(res[0]); auto iter = std::find_if(std::begin(options), std::end(options), [&member](std::string val) { return detail::to_lower(val) == member; @@ -541,9 +528,6 @@ class App { std::string simple_name = CLI::detail::split(name, ',').at(0); CLI::callback_t fun = [&member, options, simple_name](CLI::results_t res) { - if(res.size() != 1) { - throw ConversionError("Only one " + simple_name + " allowed"); - } member = detail::to_lower(res[0]); auto iter = std::find_if(std::begin(options), std::end(options), [&member](std::string val) { return detail::to_lower(val) == member; diff --git a/include/CLI/Error.hpp b/include/CLI/Error.hpp index 3e9f3b57..0758bb76 100644 --- a/include/CLI/Error.hpp +++ b/include/CLI/Error.hpp @@ -43,6 +43,7 @@ enum class ExitCodes { InvalidError, HorribleError, OptionNotFound, + ArgumentMismatch, BaseClass = 127 }; @@ -146,6 +147,17 @@ class RequiredError : public ParseError { CLI11_ERROR_SIMPLE(RequiredError) }; +/// Thrown when the wrong number of arguments has been recieved +class ArgumentMismatch : ParseError { + CLI11_ERROR_DEF(ParseError, ArgumentMismatch) + ArgumentMismatch(std::string name, int expected, size_t recieved) + : ArgumentMismatch(expected > 0 ? ("Expected exactly " + std::to_string(expected) + " arguments to " + name + + ", got " + std::to_string(recieved)) + : ("Expected at least " + std::to_string(-expected) + " arguments to " + name + + ", got " + std::to_string(recieved)), + ExitCodes::ArgumentMismatch) {} +}; + /// Thrown when a requires option is missing class RequiresError : public ParseError { CLI11_ERROR_DEF(ParseError, RequiresError) diff --git a/include/CLI/Option.hpp b/include/CLI/Option.hpp index 477a9512..b3418d18 100644 --- a/include/CLI/Option.hpp +++ b/include/CLI/Option.hpp @@ -207,14 +207,15 @@ class Option : public OptionBase