@@ -6783,6 +6783,9 @@ class App {
6783
6783
// / This is a function that runs when all processing has completed
6784
6784
std::function<void ()> final_callback_{};
6785
6785
6786
+ // / This is a function tat runs after all standard requirement checks havv been processed
6787
+ std::function<void ()> require_callback_{};
6788
+
6786
6789
// /@}
6787
6790
// / @name Options
6788
6791
// /@{
@@ -7010,6 +7013,13 @@ class App {
7010
7013
return this ;
7011
7014
}
7012
7015
7016
+ // / Set a callback to execute after all standard requirement checks have been processed
7017
+ // /
7018
+ App *require_callback (std::function<void ()> req_callback) {
7019
+ require_callback_ = std::move (req_callback);
7020
+ return this ;
7021
+ }
7022
+
7013
7023
// / Set a name for the app (empty will use parser to set the name)
7014
7024
App *name (std::string app_name = " " );
7015
7025
@@ -9415,21 +9425,34 @@ CLI11_INLINE void App::_process_requirements() {
9415
9425
}
9416
9426
}
9417
9427
for (const auto &subc : need_subcommands_) {
9418
- subc->_process_requirements ();
9428
+ try {
9429
+ subc->_process_requirements ();
9430
+ } catch (const CLI::RequiresError& e) {
9431
+ if (subc->count () == 0 ) {
9432
+ std::string out = get_display_name ();
9433
+
9434
+ for (const App* parent = get_parent (); parent != nullptr ; parent = parent->get_parent ()) {
9435
+ out = parent->get_display_name () + " :" + out;
9436
+ }
9437
+ throw RequiresError (out, subc->name_ );
9438
+ } else {
9439
+ throw ;
9440
+ }
9441
+ }
9419
9442
if (subc->count_all () == 0 ) {
9420
9443
missing_needed = true ;
9421
9444
missing_need = subc->get_display_name ();
9422
9445
}
9423
9446
}
9424
9447
if (missing_needed) {
9425
9448
if (count_all () > 0 ) {
9426
- std::string out;
9449
+ std::string out = get_display_name () ;
9427
9450
9428
9451
for (const App* parent = get_parent (); parent != nullptr ; parent = parent->get_parent ()) {
9429
9452
out = parent->get_display_name () + " :" + out;
9430
9453
}
9431
9454
9432
- throw RequiresError (out + get_display_name () , missing_need);
9455
+ throw RequiresError (out, missing_need);
9433
9456
}
9434
9457
// if we missing something but didn't have any options, just return
9435
9458
return ;
@@ -9507,13 +9530,33 @@ CLI11_INLINE void App::_process_requirements() {
9507
9530
}
9508
9531
}
9509
9532
if (sub->count () > 0 || sub->name_ .empty ()) {
9510
- sub->_process_requirements ();
9533
+ try {
9534
+ sub->_process_requirements ();
9535
+ } catch (const CLI::RequiredError& e) {
9536
+ std::string out = get_display_name () + " :" ;
9537
+
9538
+ for (const App* parent = get_parent (); parent != nullptr ; parent = parent->get_parent ()) {
9539
+ out = parent->get_display_name () + " :" + out;
9540
+ }
9541
+ throw RequiredError (out + e.what ());
9542
+ }
9511
9543
}
9512
9544
9513
9545
if (sub->required_ && sub->count_all () == 0 ) {
9514
- throw (CLI::RequiredError (sub->get_display_name ()));
9546
+ std::string out = sub->get_display_name ();
9547
+
9548
+ for (const App* parent = get_parent (); parent != nullptr ; parent = parent->get_parent ()) {
9549
+ out = parent->get_display_name () + " :" + out;
9550
+ }
9551
+
9552
+ throw (RequiredError (out));
9515
9553
}
9516
9554
}
9555
+
9556
+
9557
+ if (require_callback_) {
9558
+ require_callback_ ();
9559
+ }
9517
9560
}
9518
9561
9519
9562
CLI11_INLINE void App::_process () {
0 commit comments