Commit 0395467d488ce4a075499763301fa6b303c89a67

Authored by Henry Fredrick Schreiner
Committed by Henry Schreiner
1 parent 0bca8fdd

Making RuntimeError a ParseError

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) {}