Commit 6ed2899741d3d24914c19700b8c6cda0a0c66cbb
1 parent
f6b1bc13
Virtual options list, overridable help flag.
Showing
1 changed file
with
11 additions
and
6 deletions
include/CLI/App.hpp
| ... | ... | @@ -36,12 +36,13 @@ protected: |
| 36 | 36 | std::string name; |
| 37 | 37 | std::string prog_description; |
| 38 | 38 | std::vector<Option> options; |
| 39 | + Option* help_flag {nullptr}; | |
| 39 | 40 | std::vector<std::string> missing_options; |
| 40 | 41 | std::deque<std::string> positionals; |
| 41 | 42 | std::vector<std::unique_ptr<App>> subcommands; |
| 42 | 43 | bool parsed{false}; |
| 43 | - App* subcommand = nullptr; | |
| 44 | - std::string progname = "program"; | |
| 44 | + App* subcommand{nullptr}; | |
| 45 | + std::string progname{"program"}; | |
| 45 | 46 | |
| 46 | 47 | std::function<void()> app_callback; |
| 47 | 48 | |
| ... | ... | @@ -51,9 +52,8 @@ public: |
| 51 | 52 | /// it is not possible to overload on std::function (fixed in c++14 |
| 52 | 53 | /// and backported to c++11 on newer compilers). Use capture by reference |
| 53 | 54 | /// to get a pointer to App if needed. |
| 54 | - App* set_callback(std::function<void()> callback) { | |
| 55 | + void set_callback(std::function<void()> callback) { | |
| 55 | 56 | app_callback = callback; |
| 56 | - return this; | |
| 57 | 57 | } |
| 58 | 58 | |
| 59 | 59 | void run_callback() { |
| ... | ... | @@ -79,10 +79,15 @@ public: |
| 79 | 79 | App(std::string prog_description="") |
| 80 | 80 | : prog_description(prog_description) { |
| 81 | 81 | |
| 82 | - add_flag("-h,--help", "Print this help message and exit"); | |
| 82 | + setup(); | |
| 83 | 83 | |
| 84 | 84 | } |
| 85 | 85 | |
| 86 | + /// Setup help flag. Virtual to allow customization. | |
| 87 | + virtual void setup() { | |
| 88 | + help_flag = add_flag("-h,--help", "Print this help message and exit"); | |
| 89 | + } | |
| 90 | + | |
| 86 | 91 | App* add_subcommand(std::string name, std::string description="") { |
| 87 | 92 | subcommands.emplace_back(new App(description)); |
| 88 | 93 | subcommands.back()->name = name; |
| ... | ... | @@ -317,7 +322,7 @@ public: |
| 317 | 322 | } |
| 318 | 323 | } |
| 319 | 324 | |
| 320 | - if (count("--help") > 0) { | |
| 325 | + if (help_flag != nullptr && help_flag->count() > 0) { | |
| 321 | 326 | throw CallForHelp(); |
| 322 | 327 | } |
| 323 | 328 | ... | ... |