|
|
@@ -149,10 +149,18 @@ private:
|
|
|
friend struct ArgumentTestHelper;
|
|
|
friend int main(int, char const * const *);
|
|
|
|
|
|
+ template <typename T>
|
|
|
+ std::shared_ptr<T> make_action(std::string const & name) const {
|
|
|
+ if (action_name_ != name) { return nullptr; }
|
|
|
+ auto ptr = make_action_(static_cast<Impl const &>(*this));
|
|
|
+ return std::static_pointer_cast<T>(ptr);
|
|
|
+ }
|
|
|
+
|
|
|
private:
|
|
|
using main_callback_t = std::function<int(Impl const &)>;
|
|
|
+ using make_action_t = std::function<std::shared_ptr<void>(Impl const &)>;
|
|
|
using make_hook_t =
|
|
|
- std::function<main_callback_t(size_t, char const * const *)>;
|
|
|
+ std::function<make_action_t(size_t, char const * const *)>;
|
|
|
// Metadata variables
|
|
|
bool primed_{false};
|
|
|
detail::Any parent_;
|
|
|
@@ -163,6 +171,8 @@ private:
|
|
|
std::map<std::string, option_id> option_names;
|
|
|
std::set<option_id> flag_names;
|
|
|
std::map<std::string, make_hook_t> actions;
|
|
|
+ std::string action_name_{""};
|
|
|
+ make_action_t make_action_{nullptr};
|
|
|
std::map<std::string, std::string> action_descriptions;
|
|
|
|
|
|
// Data/Output variables
|
|
|
@@ -237,17 +247,18 @@ struct Arguments<Impl>::WithDefault {
|
|
|
|
|
|
#include "arguments_impl.hpp"
|
|
|
|
|
|
-template <typename Args, typename Action>
|
|
|
-int typed_main(Args const &, Action const &);
|
|
|
+template <typename Args, typename... Actions>
|
|
|
+int typed_main(Args const &, Actions const &...);
|
|
|
|
|
|
-#define TYPED_MAIN(tname) \
|
|
|
- int typed_main(tname const & args); \
|
|
|
+#define PROGRAM_ARGS_MAIN(tname) \
|
|
|
int main(int argc, char const * const * const argv) try { \
|
|
|
- tname args(argc, argv); \
|
|
|
- return (args.main_callback) ? args.main_callback(args) : typed_main(args); \
|
|
|
+ tname(argc, argv).invoke(); \
|
|
|
} catch (program::ProgramArgumentsError const & pae) { \
|
|
|
std::cerr << "Error in program argument handling: " << pae.what() << "\n"; \
|
|
|
- } \
|
|
|
- int typed_main(tname const & args)
|
|
|
+ }
|
|
|
+
|
|
|
+#define TYPED_MAIN(tname) \
|
|
|
+ PROGRAM_ARGS_MAIN(tname) \
|
|
|
+ template <> int typed_main(tname const & args)
|
|
|
|
|
|
#define PROGRAM_DEFER(...) [this]() { return __VA_ARGS__; }
|