8 #ifndef SCARAB_APPLICATION_HH_ 9 #define SCARAB_APPLICATION_HH_ 63 app* this_app()
const;
66 config_decorator* add_config_subcommand( std::string a_subcommand_name, std::string a_description=
"" );
70 CLI::Option* add_config_option( std::string a_name,
71 std::string a_master_config_addr,
72 std::string a_description =
"" );
75 template< typename T, CLI::enable_if_t< ! CLI::is_vector<T>::value, CLI::detail::enabler > =
CLI::detail::dummy >
76 CLI::Option* add_config_multi_option( std::string a_name,
77 std::string a_master_config_addr,
78 std::string a_description =
"" );
83 CLI::Option* add_config_flag( std::string a_name,
84 std::string a_master_config_addr,
85 std::string a_description =
"" );
89 template< typename T, CLI::enable_if_t< CLI::is_bool<T>::value, CLI::detail::enabler > =
CLI::detail::dummy >
90 CLI::Option* add_config_flag( std::string a_name,
91 std::string a_master_config_addr,
92 std::string a_description =
"" );
100 virtual void add_to_app_options(
param_node& a_app_options ) = 0;
106 template<
typename T >
111 if( ! (*f_option) )
return;
113 f_master_config_addr,
115 a_app_options.
merge( t_new_config_ptr->as_node() );
122 template<
typename T >
127 if( ! (*f_option) )
return;
129 std::for_each( f_values.begin(), f_values.end(), [&t_array]( T a_value ){ t_array.
push_back( a_value ); } );
131 f_master_config_addr,
133 a_app_options.
merge( t_new_config_ptr->as_node() );
144 if( ! (*f_option) )
return;
146 f_master_config_addr,
148 a_app_options.
merge( t_new_config_ptr->as_node() );
261 virtual void pre_callback();
265 virtual void do_config_stage_1();
267 virtual void do_config_stage_2();
269 virtual void do_config_stage_3();
271 virtual void do_config_stage_4();
299 mv_referrable( std::vector< std::shared_ptr< app_option_holder > >, app_option_holders );
305 std::string a_master_config_addr,
306 std::string a_description )
308 auto t_opt_holder_ptr = std::make_shared< app_option_holder_typed<T> >();
309 t_opt_holder_ptr->f_option = f_this->add_option( a_name, t_opt_holder_ptr->f_value, a_description );
310 t_opt_holder_ptr->f_master_config_addr = a_master_config_addr;
311 f_main->app_option_holders().push_back( t_opt_holder_ptr );
312 return t_opt_holder_ptr->f_option;
317 std::string a_master_config_addr,
318 std::string a_description )
320 auto t_opt_holder_ptr = std::make_shared< app_option_holder_vector_typed<T> >();
321 t_opt_holder_ptr->f_option = f_this->add_option( a_name, t_opt_holder_ptr->f_values, a_description );
322 t_opt_holder_ptr->f_master_config_addr = a_master_config_addr;
323 f_main->app_option_holders().push_back( t_opt_holder_ptr );
324 return t_opt_holder_ptr->f_option;
329 std::string a_master_config_addr,
330 std::string a_description )
332 auto t_opt_holder_ptr = std::make_shared< app_option_holder_typed<T> >();
333 t_opt_holder_ptr->f_option = f_this->add_flag( a_name, t_opt_holder_ptr->f_value, a_description );
334 t_opt_holder_ptr->f_master_config_addr = a_master_config_addr;
335 f_main->app_option_holders().push_back( t_opt_holder_ptr );
336 return t_opt_holder_ptr->f_option;
341 std::string a_master_config_addr,
342 std::string a_description )
344 auto t_opt_holder_ptr = std::make_shared< app_option_holder_bool_flag >();
345 t_opt_holder_ptr->f_option = f_this->add_flag( a_name, a_description );
346 t_opt_holder_ptr->f_master_config_addr = a_master_config_addr;
347 f_main->app_option_holders().push_back( t_opt_holder_ptr );
348 return t_opt_holder_ptr->f_option;
void merge(const param_node &a_object)
virtual ~app_option_holder()
constexpr enabler dummy
An instance to use in EnableIf.
virtual ~app_option_holder_typed()
static param_ptr_t parse_address(const std::string &an_addr, param_ptr_t a_value=param_ptr_t())
Converts an address into a nested param structure, and optionally attaches a value.
int main(int argc, char **argv)
std::unique_ptr< config_decorator > conf_dec_ptr_t
enabler
Simple empty scoped class.
void add_to_app_options(param_node &a_app_options)
std::vector< T > f_values
Adds the ability to create options and subcommands that are tied to a main_app's master config...
CLI::Option * add_config_flag(std::string a_name, std::string a_master_config_addr, std::string a_description="")
std::vector< conf_dec_ptr_t > f_subcommand_decorators
virtual ~app_option_holder_bool_flag()
CLI::Option * add_config_option(std::string a_name, std::string a_master_config_addr, std::string a_description="")
Add an option that gets automatically added to the master config of a main_app.
CLI::Option * add_config_multi_option(std::string a_name, std::string a_master_config_addr, std::string a_description="")
Add an option that gets automatically added to the master config of a main_app.
std::unique_ptr< param > param_ptr_t
#define mv_referrable_const
Primary application class.
std::string f_master_config_addr
void add_to_app_options(param_node &a_app_options)
void push_back(const param &a_value)
virtual ~app_option_holder_vector_typed()
void add_to_app_options(param_node &a_app_options)