diff --git a/core/lib.rs b/core/lib.rs index 9f46712eec87d3a2cc0820aeaaac14559dec2d6d..423c836ad6675992d0bacea035d589b8dc28fa82 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -69,6 +69,91 @@ use threadpool::ThreadPool; /// Number of thread in plugins ThreadPool pub static THREAD_POOL_SIZE: &'static usize = &2; +#[macro_export] +macro_rules! durs_core_server { + ( $closure_inject_cli:expr, $closure_plug:expr ) => {{ + duniter_core::main( + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_VERSION"), + &DursOpt::clap(), + $closure_inject_cli, + $closure_plug, + ); + }}; +} + +#[macro_export] +macro_rules! durs_inject_cli { + ( $( $Module:ty ),* ) => { + { + |core| { + $(core.inject_cli_subcommand::<$Module>();)* + } + } + }; +} + +#[macro_export] +macro_rules! durs_plug { + ( [ $( $NetworkModule:ty ),* ], [ $( $Module:ty ),* ] ) => { + { + |core| { + $(core.plug::<$Module>();)* + $(core.plug_network::<$NetworkModule>();)* + } + } + }; +} +/* +macro_rules! o_O { + ( + $( + $x:expr; [ $( $y:expr ),* ] + );* + ) => { + &[ $($( $x + $y ),*),* ] + } +} + + +macro_rules! vec { + ( $( $x:expr ),* ) => { + { + let mut temp_vec = Vec::new(); + $( + temp_vec.push($x); + )* + temp_vec + } + }; +}*/ + +/// Durs main function +pub fn main<'b, 'a: 'b, CliFunc, PlugFunc>( + soft_name: &'static str, + soft_version: &'static str, + clap_app: &'a App<'b, 'a>, + mut inject_modules_subcommands: CliFunc, + mut plug_modules: PlugFunc, +) where + 'b: 'a, + CliFunc: FnMut(&mut DuniterCore<'a, 'b, DuRsConf>) -> (), + PlugFunc: FnMut(&mut DuniterCore<'a, 'b, DuRsConf>) -> (), +{ + // Instantiate duniter core + let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, clap_app, 0); + + // Inject modules subcommands + inject_modules_subcommands(&mut duniter_core); + + // Match user command + if duniter_core.match_user_command() { + // Plug all plugins + plug_modules(&mut duniter_core); + duniter_core.start_core(); + } +} + #[derive(Debug, Clone)] /// User command pub enum UserCommand { @@ -149,6 +234,11 @@ impl<'a, 'b: 'a> DuniterCore<'b, 'a, DuRsConf> { thread_pool: ThreadPool::new(*THREAD_POOL_SIZE), } } + /// Inject cli subcommand + pub fn inject_cli_subcommand<M: DuniterModule<DuRsConf, DursMsg>>(&mut self) { + //self.cli_conf = TupleApp(&self.cli_conf.0.clone().subcommand(M::ModuleOpt::clap())); + self.plugins_cli_conf.push(M::ModuleOpt::clap()); + } /// Execute user command pub fn match_user_command(&mut self) -> bool { self.match_specialize_user_command(vec![], None, vec![]) @@ -446,19 +536,13 @@ impl<'a, 'b: 'a> DuniterCore<'b, 'a, DuRsConf> { } } - /// Inject cli subcommand - pub fn inject_cli_subcommand<M: DuniterModule<DuRsConf, DursMsg>>(&mut self) { - //self.cli_conf = TupleApp(&self.cli_conf.0.clone().subcommand(M::ModuleOpt::clap())); - self.plugins_cli_conf.push(M::ModuleOpt::clap()); - } - /// Plug a module pub fn plug<M: DuniterModule<DuRsConf, DursMsg>>(&mut self) { self.plug_::<M>(false); } /// Plug a module - fn plug_<M: DuniterModule<DuRsConf, DursMsg>>(&mut self, is_network_module: bool) { + pub fn plug_<M: DuniterModule<DuRsConf, DursMsg>>(&mut self, is_network_module: bool) { let enabled = enabled::<DuRsConf, DursMsg, M>(&self.soft_meta_datas.conf); if enabled { if let Some(UserCommand::Start()) = self.user_command { diff --git a/src/main.rs b/src/main.rs index 14bb6220dfe44e2388defddf5221acae6e052b93..0ef666e3306801eb8c037a5ad749443cbc36cf6e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,7 +28,9 @@ unused_qualifications )] +#[macro_use] extern crate duniter_core; + #[cfg(unix)] extern crate duniter_tui; extern crate durs_ws2p_v1_legacy; @@ -46,84 +48,20 @@ use structopt::StructOpt; #[cfg(unix)] #[cfg(not(target_arch = "arm"))] fn main() { - // Get software name and version - let soft_name = env!("CARGO_PKG_NAME"); - let soft_version = env!("CARGO_PKG_VERSION"); - - // Instantiate duniter core - let clap_app = DursOpt::clap(); - let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, &clap_app, 0); - - // Inject plugins subcommands - //duniter_core.inject_cli_subcommand::<GvaModule>(); - duniter_core.inject_cli_subcommand::<TuiModule>(); - duniter_core.inject_cli_subcommand::<WS2PModule>(); - - // Match user command - if duniter_core.match_user_command() { - // Plug all plugins - //duniter_core.plug::<GuiModule>(); - //duniter_core.plug::<GvaModule>(); - //duniter_core.plug::<PoolModule>(); - //duniter_core.plug::<PowModule>(); - duniter_core.plug::<TuiModule>(); - duniter_core.plug_network::<WS2PModule>(); - duniter_core.start_core(); - } + durs_core_server!( + durs_inject_cli![WS2PModule, TuiModule /*,DasaModule*/], + durs_plug!([WS2PModule], [TuiModule /*,DasaModule*/]) + ); } #[cfg(unix)] #[cfg(target_arch = "arm")] fn main() { - // Get software name and version - let soft_name = env!("CARGO_PKG_NAME"); - let soft_version = env!("CARGO_PKG_VERSION"); - - // Instantiate duniter core - let clap_app = DursOpt::clap(); - let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, &clap_app, 0); - - // Inject plugins subcommands - //duniter_core.inject_cli_subcommand::<DasaModule>(); - //duniter_core.inject_cli_subcommand::<GvaModule>(); - duniter_core.inject_cli_subcommand::<TuiModule>(); - duniter_core.inject_cli_subcommand::<WS2PModule>(); - - // Match user command - if duniter_core.match_user_command() { - // Plug all plugins - //duniter_core.plug::<DasaModule>(); - //duniter_core.plug::<GuiModule>(); - //duniter_core.plug::<GvaModule>(); - //duniter_core.plug::<PoolModule>(); - //duniter_core.plug::<PowModule>(); - duniter_core.plug::<TuiModule>(); - duniter_core.plug_network::<WS2PModule>(); - duniter_core.start_core(); - } + durs_core_server!( + durs_inject_cli![WS2PModule, TuiModule], + durs_plug!([WS2PModule], [TuiModule]) + ); } #[cfg(windows)] fn main() { - // Get software name and version - let soft_name = env!("CARGO_PKG_NAME"); - let soft_version = env!("CARGO_PKG_VERSION"); - - // Instantiate duniter core - let clap_app = DursOpt::clap(); - let mut duniter_core = DuniterCore::<DuRsConf>::new(soft_name, soft_version, &clap_app, 0); - - // Inject plugins subcommands - //duniter_core.inject_cli_subcommand::<GvaModule>(); - duniter_core.inject_cli_subcommand::<WS2PModule>(); - - // Match user command - if duniter_core.match_user_command() { - // Plug all plugins - //duniter_core.plug::<DasaModule>(); - //duniter_core.plug::<GuiModule>(); - //duniter_core.plug::<GvaModule>(); - //duniter_core.plug::<PoolModule>(); - //duniter_core.plug::<PowModule>(); - duniter_core.plug_network::<WS2PModule>(); - duniter_core.start_core(); - } + durs_core_server!(durs_inject_cli![WS2PModule], durs_plug!([WS2PModule], [])); }