Commit 0395467d488ce4a075499763301fa6b303c89a67
Committed by
Henry Schreiner
1 parent
0bca8fdd
Making RuntimeError a ParseError
Showing
7 changed files
with
20 additions
and
24 deletions
README.md
| @@ -96,7 +96,7 @@ app.add_option("-f,--file", filename, "A help string"); | @@ -96,7 +96,7 @@ app.add_option("-f,--file", filename, "A help string"); | ||
| 96 | 96 | ||
| 97 | try { | 97 | try { |
| 98 | app.parse(argc, argv); | 98 | app.parse(argc, argv); |
| 99 | -} catch (const CLI::Error &e) { | 99 | +} catch (const CLI::ParseError &e) { |
| 100 | return app.exit(e); | 100 | return app.exit(e); |
| 101 | } | 101 | } |
| 102 | ``` | 102 | ``` |
| @@ -137,7 +137,7 @@ App* subcom = app.add_subcommand(name, discription); | @@ -137,7 +137,7 @@ App* subcom = app.add_subcommand(name, discription); | ||
| 137 | 137 | ||
| 138 | An option name must start with a alphabetic character or underscore. For long options, anything but an equals sign or a comma is valid after that. Names are given as a comma separated string, with the dash or dashes. An option or flag can have as many names as you want, and afterward, using `count`, you can use any of the names, with dashes as needed, to count the options. One of the names is allowed to be given without proceeding dash(es); if present the option is a positional option, and that name will be used on help line for its positional form. If you want the default value to print in the help description, pass in `true` for the final parameter for `add_option` or `add_set`. The set options allow your users to pick from a set of predefined options. | 138 | An option name must start with a alphabetic character or underscore. For long options, anything but an equals sign or a comma is valid after that. Names are given as a comma separated string, with the dash or dashes. An option or flag can have as many names as you want, and afterward, using `count`, you can use any of the names, with dashes as needed, to count the options. One of the names is allowed to be given without proceeding dash(es); if present the option is a positional option, and that name will be used on help line for its positional form. If you want the default value to print in the help description, pass in `true` for the final parameter for `add_option` or `add_set`. The set options allow your users to pick from a set of predefined options. |
| 139 | 139 | ||
| 140 | -On a C++14 compiler, you can pass a callback function directly to `.add_flag`, while in C++11 mode you'll need to use `.add_flag_function` if you want a callback function. The function will be given the number of times the flag was passed. You can throw a relevant `CLI::Error` to signal a failure. | 140 | +On a C++14 compiler, you can pass a callback function directly to `.add_flag`, while in C++11 mode you'll need to use `.add_flag_function` if you want a callback function. The function will be given the number of times the flag was passed. You can throw a relevant `CLI::ParseError` to signal a failure. |
| 141 | 141 | ||
| 142 | ### Example | 142 | ### Example |
| 143 | 143 | ||
| @@ -289,7 +289,7 @@ If you use the excellent [Rang] library to add color to your terminal in a safe, | @@ -289,7 +289,7 @@ If you use the excellent [Rang] library to add color to your terminal in a safe, | ||
| 289 | std::atexit([](){std::cout << rang::style::reset;}); | 289 | std::atexit([](){std::cout << rang::style::reset;}); |
| 290 | try { | 290 | try { |
| 291 | app.parse(argc, argv); | 291 | app.parse(argc, argv); |
| 292 | -} catch (const CLI::Error &e) { | 292 | +} catch (const CLI::ParseError &e) { |
| 293 | std::cout << (e.get_exit_code()==0 ? rang::fg::blue : rang::fg::red); | 293 | std::cout << (e.get_exit_code()==0 ? rang::fg::blue : rang::fg::red); |
| 294 | return app.exit(e); | 294 | return app.exit(e); |
| 295 | } | 295 | } |
examples/enum.cpp
| @@ -9,10 +9,7 @@ int main(int argc, char **argv) { | @@ -9,10 +9,7 @@ int main(int argc, char **argv) { | ||
| 9 | app.add_set("-l,--level", level, {High, Medium, Low}, "Level settings") | 9 | app.add_set("-l,--level", level, {High, Medium, Low}, "Level settings") |
| 10 | ->set_type_name("enum/Level in {High=0, Medium=1, Low=2}"); | 10 | ->set_type_name("enum/Level in {High=0, Medium=1, Low=2}"); |
| 11 | 11 | ||
| 12 | - try { | ||
| 13 | - app.parse(argc, argv); | ||
| 14 | - } catch(CLI::Error const &e) { | ||
| 15 | - app.exit(e); | ||
| 16 | - } | 12 | + CLI11_PARSE(app, argc, argv); |
| 13 | + | ||
| 17 | return 0; | 14 | return 0; |
| 18 | } | 15 | } |
examples/groups.cpp
| @@ -17,7 +17,7 @@ int main(int argc, char **argv) { | @@ -17,7 +17,7 @@ int main(int argc, char **argv) { | ||
| 17 | 17 | ||
| 18 | try { | 18 | try { |
| 19 | app.parse(argc, argv); | 19 | app.parse(argc, argv); |
| 20 | - } catch(const CLI::Error &e) { | 20 | + } catch(const CLI::ParseError &e) { |
| 21 | return app.exit(e); | 21 | return app.exit(e); |
| 22 | } | 22 | } |
| 23 | 23 |
examples/inter_argument_order.cpp
| @@ -15,10 +15,10 @@ int main(int argc, char **argv) { | @@ -15,10 +15,10 @@ int main(int argc, char **argv) { | ||
| 15 | 15 | ||
| 16 | app.add_flag("--z,--x"); // Random other flags | 16 | app.add_flag("--z,--x"); // Random other flags |
| 17 | 17 | ||
| 18 | - // Standard parsing lines (copy and paste in) | 18 | + // Standard parsing lines (copy and paste in, or use CLI11_PARSE) |
| 19 | try { | 19 | try { |
| 20 | app.parse(argc, argv); | 20 | app.parse(argc, argv); |
| 21 | - } catch(const CLI::Error &e) { | 21 | + } catch(const CLI::ParseError &e) { |
| 22 | return app.exit(e); | 22 | return app.exit(e); |
| 23 | } | 23 | } |
| 24 | 24 |
examples/subcommands.cpp
| @@ -12,11 +12,7 @@ int main(int argc, char **argv) { | @@ -12,11 +12,7 @@ int main(int argc, char **argv) { | ||
| 12 | 12 | ||
| 13 | CLI::Option *s = stop->add_flag("-c,--count", "Counter"); | 13 | CLI::Option *s = stop->add_flag("-c,--count", "Counter"); |
| 14 | 14 | ||
| 15 | - try { | ||
| 16 | - app.parse(argc, argv); | ||
| 17 | - } catch(const CLI::Error &e) { | ||
| 18 | - return app.exit(e); | ||
| 19 | - } | 15 | + CLI11_PARSE(app, argc, argv); |
| 20 | 16 | ||
| 21 | std::cout << "Working on file: " << file << ", direct count: " << start->count("--file") << std::endl; | 17 | std::cout << "Working on file: " << file << ", direct count: " << start->count("--file") << std::endl; |
| 22 | std::cout << "Working on count: " << s->count() << ", direct count: " << stop->count("--count") << std::endl; | 18 | std::cout << "Working on count: " << s->count() << ", direct count: " << stop->count("--count") << std::endl; |
include/CLI/App.hpp
| @@ -29,7 +29,7 @@ namespace CLI { | @@ -29,7 +29,7 @@ namespace CLI { | ||
| 29 | #define CLI11_PARSE(app, argc, argv) \ | 29 | #define CLI11_PARSE(app, argc, argv) \ |
| 30 | try { \ | 30 | try { \ |
| 31 | (app).parse((argc), (argv)); \ | 31 | (app).parse((argc), (argv)); \ |
| 32 | - } catch(const CLI::Error &e) { \ | 32 | + } catch(const CLI::ParseError &e) { \ |
| 33 | return (app).exit(e); \ | 33 | return (app).exit(e); \ |
| 34 | } | 34 | } |
| 35 | #endif | 35 | #endif |
include/CLI/Error.hpp
| @@ -79,19 +79,17 @@ struct OptionAlreadyAdded : public ConstructionError { | @@ -79,19 +79,17 @@ struct OptionAlreadyAdded : public ConstructionError { | ||
| 79 | : ConstructionError("OptionAlreadyAdded", name, ExitCodes::OptionAlreadyAdded) {} | 79 | : ConstructionError("OptionAlreadyAdded", name, ExitCodes::OptionAlreadyAdded) {} |
| 80 | }; | 80 | }; |
| 81 | 81 | ||
| 82 | -// Runtime Errors | ||
| 83 | - | ||
| 84 | -/// Does not output a diagnostic in CLI11_PARSE, but allows to return from main() with a specific error code. | ||
| 85 | -struct RuntimeError : public Error { | ||
| 86 | - RuntimeError(int exit_code = 1) : Error("RuntimeError", "runtime error", exit_code, false) {} | ||
| 87 | -}; | ||
| 88 | - | ||
| 89 | // Parsing errors | 82 | // Parsing errors |
| 90 | 83 | ||
| 91 | /// Anything that can error in Parse | 84 | /// Anything that can error in Parse |
| 92 | struct ParseError : public Error { | 85 | struct ParseError : public Error { |
| 93 | ParseError(std::string parent, std::string name, ExitCodes exit_code = ExitCodes::BaseClass, bool print_help = true) | 86 | ParseError(std::string parent, std::string name, ExitCodes exit_code = ExitCodes::BaseClass, bool print_help = true) |
| 94 | : Error(parent, name, exit_code, print_help) {} | 87 | : Error(parent, name, exit_code, print_help) {} |
| 88 | + ParseError(std::string parent, | ||
| 89 | + std::string name, | ||
| 90 | + int exit_code = static_cast<int>(ExitCodes::BaseClass), | ||
| 91 | + bool print_help = true) | ||
| 92 | + : Error(parent, name, exit_code, print_help) {} | ||
| 95 | }; | 93 | }; |
| 96 | 94 | ||
| 97 | // Not really "errors" | 95 | // Not really "errors" |
| @@ -107,6 +105,11 @@ struct CallForHelp : public ParseError { | @@ -107,6 +105,11 @@ struct CallForHelp : public ParseError { | ||
| 107 | : ParseError("CallForHelp", "This should be caught in your main function, see examples", ExitCodes::Success) {} | 105 | : ParseError("CallForHelp", "This should be caught in your main function, see examples", ExitCodes::Success) {} |
| 108 | }; | 106 | }; |
| 109 | 107 | ||
| 108 | +/// Does not output a diagnostic in CLI11_PARSE, but allows to return from main() with a specific error code. | ||
| 109 | +struct RuntimeError : public ParseError { | ||
| 110 | + RuntimeError(int exit_code = 1) : ParseError("RuntimeError", "runtime error", exit_code, false) {} | ||
| 111 | +}; | ||
| 112 | + | ||
| 110 | /// Thrown when parsing an INI file and it is missing | 113 | /// Thrown when parsing an INI file and it is missing |
| 111 | struct FileError : public ParseError { | 114 | struct FileError : public ParseError { |
| 112 | FileError(std::string name) : ParseError("FileError", name, ExitCodes::File) {} | 115 | FileError(std::string name) : ParseError("FileError", name, ExitCodes::File) {} |