From 879cdfdd6b78df58c0a89a78698ca4b0fc05d97d Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Sat, 11 May 2019 20:50:48 +0200
Subject: [PATCH] [feat] conf: add method default_sync_module() & use it for
 sync command

---
 lib/core/conf/src/lib.rs   |  10 +++-
 lib/core/core/src/lib.rs   | 115 ++++++++++++++++++++-----------------
 lib/core/module/src/lib.rs |   2 +
 3 files changed, 72 insertions(+), 55 deletions(-)

diff --git a/lib/core/conf/src/lib.rs b/lib/core/conf/src/lib.rs
index 85910f6e..061f15a2 100644
--- a/lib/core/conf/src/lib.rs
+++ b/lib/core/conf/src/lib.rs
@@ -221,20 +221,26 @@ pub enum DuRsGlobalConf {
 }
 
 impl DursGlobalConfTrait for DuRsGlobalConf {
-    /// Get currency
     fn currency(&self) -> CurrencyName {
         match *self {
             DuRsGlobalConf::V1(ref conf_v1) => conf_v1.currency.clone(),
             DuRsGlobalConf::V2(ref conf_v2) => conf_v2.currency.clone(),
         }
     }
-    /// Get node id
     fn my_node_id(&self) -> u32 {
         match *self {
             DuRsGlobalConf::V1(ref conf_v1) => conf_v1.my_node_id,
             DuRsGlobalConf::V2(ref conf_v2) => conf_v2.my_node_id,
         }
     }
+    fn default_sync_module(&self) -> ModuleName {
+        match *self {
+            DuRsGlobalConf::V1(_) => {
+                fatal_error!("Feature default_sync_module not exist in durs conf v1 !")
+            }
+            DuRsGlobalConf::V2(ref conf_v2) => conf_v2.default_sync_module.clone(),
+        }
+    }
 }
 
 impl Default for DuRsConf {
diff --git a/lib/core/core/src/lib.rs b/lib/core/core/src/lib.rs
index 0890fbe0..32826c32 100644
--- a/lib/core/core/src/lib.rs
+++ b/lib/core/core/src/lib.rs
@@ -347,56 +347,68 @@ impl DursCore<DuRsConf> {
         if enabled {
             self.network_modules_count += 1;
             if let Some(ServerMode::_Sync(ref network_sync)) = self.server_command {
-                // Start module in a new thread
-                let router_sender = self
-                    .router_sender
-                    .clone()
-                    .expect("Try to start a core without router_sender !");
-                let soft_meta_datas = self.soft_meta_datas.clone();
-                let module_conf_json = self
-                    .soft_meta_datas
-                    .conf
-                    .clone()
-                    .modules()
-                    .get(&NM::name().to_string().as_str())
-                    .cloned();
-                let keypairs = self.keypairs;
-
-                // Load module conf and keys
-                let ((module_conf, _), required_keys) = get_module_conf_and_keys::<NM>(
-                    &soft_meta_datas.conf.get_global_conf(),
-                    module_conf_json,
-                    keypairs,
-                )?;
-
-                let sync_params = network_sync.clone();
-                let thread_builder = thread::Builder::new().name(NM::name().0.into());
-                self.threads.insert(
-                    NM::name(),
-                    thread_builder
-                        .spawn(move || {
-                            NM::sync(
-                                &soft_meta_datas,
-                                required_keys,
-                                module_conf,
-                                router_sender,
-                                sync_params,
-                            )
-                            .unwrap_or_else(|_| {
-                                fatal_error!(
-                                    "Fatal error : fail to load module '{}' !",
-                                    NM::name().to_string()
+                if NM::name().0
+                    == self
+                        .soft_meta_datas
+                        .conf
+                        .get_global_conf()
+                        .default_sync_module()
+                        .0
+                {
+                    // Start module in a new thread
+                    let router_sender = self
+                        .router_sender
+                        .clone()
+                        .expect("Try to start a core without router_sender !");
+                    let soft_meta_datas = self.soft_meta_datas.clone();
+                    let module_conf_json = self
+                        .soft_meta_datas
+                        .conf
+                        .clone()
+                        .modules()
+                        .get(&NM::name().to_string().as_str())
+                        .cloned();
+                    let keypairs = self.keypairs;
+
+                    // Load module conf and keys
+                    let ((module_conf, _), required_keys) = get_module_conf_and_keys::<NM>(
+                        &soft_meta_datas.conf.get_global_conf(),
+                        module_conf_json,
+                        keypairs,
+                    )?;
+
+                    let sync_params = network_sync.clone();
+                    let thread_builder = thread::Builder::new().name(NM::name().0.into());
+                    self.threads.insert(
+                        NM::name(),
+                        thread_builder
+                            .spawn(move || {
+                                NM::sync(
+                                    &soft_meta_datas,
+                                    required_keys,
+                                    module_conf,
+                                    router_sender,
+                                    sync_params,
                                 )
-                            });
-                        })
-                        .map_err(|e| PlugModuleError::FailSpawnModuleThread {
-                            module_name: NM::name(),
-                            error: e,
-                        })?,
-                );
-                self.modules_names.push(NM::name());
-                info!("Success to load {} module.", NM::name().to_string());
-                Ok(())
+                                .unwrap_or_else(|_| {
+                                    fatal_error!(
+                                        "Fatal error : fail to load module '{}' !",
+                                        NM::name().to_string()
+                                    )
+                                });
+                            })
+                            .map_err(|e| PlugModuleError::FailSpawnModuleThread {
+                                module_name: NM::name(),
+                                error: e,
+                            })?,
+                    );
+                    self.modules_names.push(NM::name());
+                    info!("Success to load {} module.", NM::name().to_string());
+                    Ok(())
+                } else {
+                    debug!("Module '{}' not used for sync.", NM::name());
+                    Ok(())
+                }
             } else {
                 self.plug_::<NM>(true)
             }
@@ -453,11 +465,8 @@ impl DursCore<DuRsConf> {
                                 required_keys,
                                 module_conf,
                                 router_sender_clone,
-                                false,
                             )
-                            .unwrap_or_else(|_| {
-                                fatal_error!("Fail to load module '{}' !", M::name())
-                            });
+                            .unwrap_or_else(|e| fatal_error!("Module '{}': {}", M::name(), e));
                         })
                         .map_err(|e| PlugModuleError::FailSpawnModuleThread {
                             module_name: M::name(),
diff --git a/lib/core/module/src/lib.rs b/lib/core/module/src/lib.rs
index 47472f6c..ff44aba4 100644
--- a/lib/core/module/src/lib.rs
+++ b/lib/core/module/src/lib.rs
@@ -108,6 +108,8 @@ pub trait DursGlobalConfTrait:
     fn currency(&self) -> CurrencyName;
     /// Get node id
     fn my_node_id(&self) -> u32;
+    /// Get default sync module
+    fn default_sync_module(&self) -> ModuleName;
 }
 
 /// Durs configuration trait
-- 
GitLab