diff --git a/include/CLI/App.hpp b/include/CLI/App.hpp index 085209d4..e7e0a6f3 100644 --- a/include/CLI/App.hpp +++ b/include/CLI/App.hpp @@ -452,7 +452,7 @@ class App { CLI::callback_t fun = [&member, options, simple_name](CLI::results_t res) { bool retval = detail::lexical_cast(res[0], member); if(!retval) - throw ConversionError("The value " + res[0] + "is not an allowed value for " + simple_name); + throw ConversionError(res[0], simple_name); return std::find(std::begin(options), std::end(options), member) != std::end(options); }; @@ -475,7 +475,7 @@ class App { CLI::callback_t fun = [&member, options, simple_name](CLI::results_t res) { bool retval = detail::lexical_cast(res[0], member); if(!retval) - throw ConversionError("The value " + res[0] + "is not an allowed value for " + simple_name); + throw ConversionError(res[0], simple_name); return std::find(std::begin(options), std::end(options), member) != std::end(options); }; @@ -504,7 +504,7 @@ class App { return detail::to_lower(val) == member; }); if(iter == std::end(options)) - throw ConversionError("The value " + member + "is not an allowed value for " + simple_name); + throw ConversionError(member, simple_name); else { member = *iter; return true; @@ -533,7 +533,7 @@ class App { return detail::to_lower(val) == member; }); if(iter == std::end(options)) - throw ConversionError("The value " + member + "is not an allowed value for " + simple_name); + throw ConversionError(member, simple_name); else { member = *iter; return true; @@ -1149,12 +1149,7 @@ class App { // Required but empty if(opt->get_required() && opt->count() == 0) - throw RequiredError(opt->help_name() + " is required"); - - // Partially filled - if(opt->get_expected() > 0 && static_cast(opt->count()) < opt->get_expected()) - throw RequiredError(opt->help_name() + " requires " + std::to_string(opt->get_expected()) + - " arguments"); + throw RequiredError(opt->single_name() + " is required"); } // Requires for(const Option *opt_req : opt->requires_) @@ -1409,8 +1404,8 @@ class App { } if(num > 0) { - throw RequiredError(op->single_name() + ": " + std::to_string(num) + " required " + - op->get_type_name() + " missing"); + throw ArgumentMismatch(op->single_name() + ": " + std::to_string(num) + " required " + + op->get_type_name() + " missing"); } } @@ -1490,8 +1485,8 @@ class App { args.pop_back(); } if(num > 0) { - throw RequiredError(op->single_name() + ": " + std::to_string(num) + " required " + - op->get_type_name() + " missing"); + throw ArgumentMismatch(op->single_name() + ": " + std::to_string(num) + " required " + + op->get_type_name() + " missing"); } } return; diff --git a/include/CLI/Error.hpp b/include/CLI/Error.hpp index 0758bb76..8916381c 100644 --- a/include/CLI/Error.hpp +++ b/include/CLI/Error.hpp @@ -126,19 +126,22 @@ class RuntimeError : public ParseError { /// Thrown when parsing an INI file and it is missing class FileError : public ParseError { CLI11_ERROR_DEF(ParseError, FileError) - FileError(std::string msg) : FileError(msg, ExitCodes::File) {} + FileError(std::string name) : FileError(name + " was not readable (missing?)", ExitCodes::File) {} }; /// Thrown when conversion call back fails, such as when an int fails to coerce to a string class ConversionError : public ParseError { CLI11_ERROR_DEF(ParseError, ConversionError) CLI11_ERROR_SIMPLE(ConversionError) + ConversionError(std::string member, std::string name) + : ConversionError("The value " + member + "is not an allowed value for " + name) {} }; /// Thrown when validation of results fails class ValidationError : public ParseError { CLI11_ERROR_DEF(ParseError, ValidationError) CLI11_ERROR_SIMPLE(ValidationError) + ValidationError(std::string name, std::string msg) : ValidationError(name + ": " + msg) {} }; /// Thrown when a required option is missing @@ -150,6 +153,7 @@ class RequiredError : public ParseError { /// Thrown when the wrong number of arguments has been recieved class ArgumentMismatch : ParseError { CLI11_ERROR_DEF(ParseError, ArgumentMismatch) + CLI11_ERROR_SIMPLE(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)) diff --git a/include/CLI/Ini.hpp b/include/CLI/Ini.hpp index 9d3663f0..bab094d9 100644 --- a/include/CLI/Ini.hpp +++ b/include/CLI/Ini.hpp @@ -106,7 +106,7 @@ inline std::vector parse_ini(const std::string &name) { std::ifstream input{name}; if(!input.good()) - throw FileError(name + " was not readable (missing?)"); + throw FileError(name); return parse_ini(input); } diff --git a/include/CLI/Option.hpp b/include/CLI/Option.hpp index b3418d18..4a577c1f 100644 --- a/include/CLI/Option.hpp +++ b/include/CLI/Option.hpp @@ -438,7 +438,7 @@ class Option : public OptionBase