Просмотр исходного кода

use generic struct for loading configurations

ghassmo 5 лет назад
Родитель
Сommit
d90fe538f6
6 измененных файлов с 120 добавлено и 175 удалено
  1. 24 21
      src/bin/cashierd.rs
  2. 22 21
      src/bin/darkfid.rs
  3. 24 23
      src/bin/drk.rs
  4. 24 23
      src/bin/gatewayd.rs
  5. 25 86
      src/cli/cli_config.rs
  6. 1 1
      src/cli/mod.rs

+ 24 - 21
src/bin/cashierd.rs

@@ -5,7 +5,7 @@ use std::{path::Path, path::PathBuf};
 //use toml;
 //use toml;
 
 
 use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
 use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
-use drk::cli::{CashierdCli, CashierdConfig};
+use drk::cli::{CashierdCli, CashierdConfig, Config};
 use drk::service::CashierService;
 use drk::service::CashierService;
 use drk::wallet::{WalletDb, WalletPtr};
 use drk::wallet::{WalletDb, WalletPtr};
 
 
@@ -35,41 +35,44 @@ async fn start(executor: Arc<Executor<'_>>, config: Arc<&CashierdConfig>) -> Res
 }
 }
 
 
 fn main() -> Result<()> {
 fn main() -> Result<()> {
-    use simplelog::*;
-
     let ex = Arc::new(Executor::new());
     let ex = Arc::new(Executor::new());
     let (signal, shutdown) = async_channel::unbounded::<()>();
     let (signal, shutdown) = async_channel::unbounded::<()>();
 
 
     let path = join_config_path(&PathBuf::from("cashierd.toml")).unwrap();
     let path = join_config_path(&PathBuf::from("cashierd.toml")).unwrap();
 
 
     let config: CashierdConfig = if Path::new(&path).exists() {
     let config: CashierdConfig = if Path::new(&path).exists() {
-        CashierdConfig::load(path)?
+        Config::<CashierdConfig>::load(path)?
     } else {
     } else {
-        CashierdConfig::load_default(path)?
+        Config::<CashierdConfig>::load_default(path)?
     };
     };
 
 
     let config_ptr = Arc::new(&config);
     let config_ptr = Arc::new(&config);
 
 
     let options = CashierdCli::load()?;
     let options = CashierdCli::load()?;
 
 
-    let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
+    {
+        use simplelog::*;
+        let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
+
+        let debug_level = if options.verbose {
+            LevelFilter::Debug
+        } else {
+            LevelFilter::Off
+        };
+
+        let log_path = config.log_path.clone();
+        CombinedLogger::init(vec![
+            TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
+            WriteLogger::new(
+                LevelFilter::Debug,
+                Config::default(),
+                std::fs::File::create(log_path).unwrap(),
+            ),
+        ])
+        .unwrap();
+    }
 
 
-    let debug_level = if options.verbose {
-        LevelFilter::Debug
-    } else {
-        LevelFilter::Off
-    };
 
 
-    let log_path = config.log_path.clone();
-    CombinedLogger::init(vec![
-        TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
-        WriteLogger::new(
-            LevelFilter::Debug,
-            Config::default(),
-            std::fs::File::create(log_path).unwrap(),
-        ),
-    ])
-    .unwrap();
 
 
     let ex2 = ex.clone();
     let ex2 = ex.clone();
 
 

+ 22 - 21
src/bin/darkfid.rs

@@ -1,5 +1,5 @@
 use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
 use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
-use drk::cli::{DarkfidCli, DarkfidConfig};
+use drk::cli::{DarkfidCli, DarkfidConfig, Config};
 use drk::crypto::{
 use drk::crypto::{
     load_params,
     load_params,
     merkle::{CommitmentTree, IncrementalWitness},
     merkle::{CommitmentTree, IncrementalWitness},
@@ -220,16 +220,14 @@ async fn start(executor: Arc<Executor<'_>>, config: Arc<&DarkfidConfig>) -> Resu
 }
 }
 
 
 fn main() -> Result<()> {
 fn main() -> Result<()> {
-    use simplelog::*;
-
     let options = Arc::new(DarkfidCli::load()?);
     let options = Arc::new(DarkfidCli::load()?);
 
 
     let path = join_config_path(&PathBuf::from("darkfid.toml")).unwrap();
     let path = join_config_path(&PathBuf::from("darkfid.toml")).unwrap();
 
 
     let config: DarkfidConfig = if Path::new(&path).exists() {
     let config: DarkfidConfig = if Path::new(&path).exists() {
-        DarkfidConfig::load(path)?
+        Config::<DarkfidConfig>::load(path)?
     } else {
     } else {
-        DarkfidConfig::load_default(path)?
+        Config::<DarkfidConfig>::load_default(path)?
     };
     };
 
 
     let config_ptr = Arc::new(&config);
     let config_ptr = Arc::new(&config);
@@ -237,24 +235,27 @@ fn main() -> Result<()> {
     let ex = Arc::new(Executor::new());
     let ex = Arc::new(Executor::new());
     let (signal, shutdown) = async_channel::unbounded::<()>();
     let (signal, shutdown) = async_channel::unbounded::<()>();
 
 
-    let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
+    {
+        use simplelog::*;
+        let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
 
 
-    let debug_level = if options.verbose {
-        LevelFilter::Debug
-    } else {
-        LevelFilter::Off
-    };
+        let debug_level = if options.verbose {
+            LevelFilter::Debug
+        } else {
+            LevelFilter::Off
+        };
 
 
-    let log_path = config.log_path.clone();
-    CombinedLogger::init(vec![
-        TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
-        WriteLogger::new(
-            LevelFilter::Debug,
-            Config::default(),
-            std::fs::File::create(log_path).unwrap(),
-        ),
-    ])
-    .unwrap();
+        let log_path = config.log_path.clone();
+        CombinedLogger::init(vec![
+            TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
+            WriteLogger::new(
+                LevelFilter::Debug,
+                Config::default(),
+                std::fs::File::create(log_path).unwrap(),
+            ),
+        ])
+        .unwrap();
+    }
 
 
     let ex2 = ex.clone();
     let ex2 = ex.clone();
 
 

+ 24 - 23
src/bin/drk.rs

@@ -1,4 +1,4 @@
-use drk::cli::{DrkCli, DrkConfig};
+use drk::cli::{DrkCli, DrkConfig, Config};
 use drk::util::join_config_path;
 use drk::util::join_config_path;
 use drk::Result;
 use drk::Result;
 use log::*;
 use log::*;
@@ -162,38 +162,39 @@ async fn start(config: &DrkConfig, options: DrkCli) -> Result<()> {
 }
 }
 
 
 fn main() -> Result<()> {
 fn main() -> Result<()> {
-    use simplelog::*;
-
     let options = DrkCli::load()?;
     let options = DrkCli::load()?;
 
 
     let path = join_config_path(&PathBuf::from("drk.toml")).unwrap();
     let path = join_config_path(&PathBuf::from("drk.toml")).unwrap();
 
 
     let config: DrkConfig = if Path::new(&path).exists() {
     let config: DrkConfig = if Path::new(&path).exists() {
-        DrkConfig::load(path)?
+        Config::<DrkConfig>::load(path)?
     } else {
     } else {
-        DrkConfig::load_default(path)?
+        Config::<DrkConfig>::load_default(path)?
     };
     };
 
 
     let config_ptr = &config;
     let config_ptr = &config;
 
 
-    let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
-
-    let debug_level = if options.verbose {
-        LevelFilter::Info
-    } else {
-        LevelFilter::Off
-    };
-
-    let log_path = config.log_path.clone();
-    CombinedLogger::init(vec![
-        TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
-        WriteLogger::new(
-            LevelFilter::Debug,
-            Config::default(),
-            std::fs::File::create(log_path).unwrap(),
-        ),
-    ])
-    .unwrap();
+    {
+        use simplelog::*;
+        let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
+
+        let debug_level = if options.verbose {
+            LevelFilter::Debug
+        } else {
+            LevelFilter::Off
+        };
+
+        let log_path = config.log_path.clone();
+        CombinedLogger::init(vec![
+            TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
+            WriteLogger::new(
+                LevelFilter::Debug,
+                Config::default(),
+                std::fs::File::create(log_path).unwrap(),
+            ),
+        ])
+        .unwrap();
+    }
 
 
     futures::executor::block_on(start(config_ptr, options))?;
     futures::executor::block_on(start(config_ptr, options))?;
 
 

+ 24 - 23
src/bin/gatewayd.rs

@@ -2,7 +2,7 @@ use std::net::SocketAddr;
 use std::sync::Arc;
 use std::sync::Arc;
 
 
 use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
 use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
-use drk::cli::{GatewaydCli, GatewaydConfig};
+use drk::cli::{Config, GatewaydCli, GatewaydConfig};
 use drk::service::GatewayService;
 use drk::service::GatewayService;
 use drk::util::join_config_path;
 use drk::util::join_config_path;
 use drk::Result;
 use drk::Result;
@@ -28,41 +28,42 @@ async fn start(executor: Arc<Executor<'_>>, config: Arc<&GatewaydConfig>) -> Res
 }
 }
 
 
 fn main() -> Result<()> {
 fn main() -> Result<()> {
-    use simplelog::*;
-
     let ex = Arc::new(Executor::new());
     let ex = Arc::new(Executor::new());
     let (signal, shutdown) = async_channel::unbounded::<()>();
     let (signal, shutdown) = async_channel::unbounded::<()>();
 
 
     let path = join_config_path(&PathBuf::from("gatewayd.toml")).unwrap();
     let path = join_config_path(&PathBuf::from("gatewayd.toml")).unwrap();
 
 
     let config: GatewaydConfig = if Path::new(&path).exists() {
     let config: GatewaydConfig = if Path::new(&path).exists() {
-        GatewaydConfig::load(path)?
+        Config::<GatewaydConfig>::load(path)?
     } else {
     } else {
-        GatewaydConfig::load_default(path)?
+        Config::<GatewaydConfig>::load_default(path)?
     };
     };
 
 
     let config_ptr = Arc::new(&config);
     let config_ptr = Arc::new(&config);
 
 
     let options = GatewaydCli::load()?;
     let options = GatewaydCli::load()?;
 
 
-    let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
-
-    let debug_level = if options.verbose {
-        LevelFilter::Debug
-    } else {
-        LevelFilter::Off
-    };
-
-    let log_path = config.log_path.clone();
-    CombinedLogger::init(vec![
-        TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
-        WriteLogger::new(
-            LevelFilter::Debug,
-            Config::default(),
-            std::fs::File::create(log_path).unwrap(),
-        ),
-    ])
-    .unwrap();
+    {
+        use simplelog::*;
+        let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
+
+        let debug_level = if options.verbose {
+            LevelFilter::Debug
+        } else {
+            LevelFilter::Off
+        };
+
+        let log_path = config.log_path.clone();
+        CombinedLogger::init(vec![
+            TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
+            WriteLogger::new(
+                LevelFilter::Debug,
+                Config::default(),
+                std::fs::File::create(log_path).unwrap(),
+            ),
+        ])
+        .unwrap();
+    }
 
 
     let ex2 = ex.clone();
     let ex2 = ex.clone();
 
 

+ 25 - 86
src/cli/cli_config.rs

@@ -1,35 +1,31 @@
 use crate::util::join_config_path;
 use crate::util::join_config_path;
 use crate::Result;
 use crate::Result;
+
 use serde::{Deserialize, Serialize};
 use serde::{Deserialize, Serialize};
-use std::str;
+use serde::de::DeserializeOwned;
 
 
+use std::marker::PhantomData;
+use std::str;
 use std::{
 use std::{
     fs,
     fs,
     fs::{create_dir_all, File},
     fs::{create_dir_all, File},
     io::Write,
     io::Write,
 };
 };
 
 
-use std::path::PathBuf;
-
-#[derive(Serialize, Deserialize, Debug)]
-pub struct DrkConfig {
-    #[serde(default)]
-    pub rpc_url: String,
-
-    #[serde(default)]
-    pub log_path: String,
+pub struct Config<T> {
+    config: PhantomData<T>,
 }
 }
 
 
-impl DrkConfig {
-    pub fn load(path: PathBuf) -> Result<Self> {
+impl<T: Default + Serialize + DeserializeOwned> Config<T> {
+    pub fn load(path: PathBuf) -> Result<T> {
         let toml = fs::read(&path)?;
         let toml = fs::read(&path)?;
         let str_buff = str::from_utf8(&toml)?;
         let str_buff = str::from_utf8(&toml)?;
-        let config: Self = toml::from_str(str_buff)?;
+        let config: T = toml::from_str(str_buff.clone())?;
         Ok(config)
         Ok(config)
     }
     }
 
 
-    pub fn load_default(path: PathBuf) -> Result<Self> {
-        let toml = Self::default();
+    pub fn load_default(path: PathBuf) -> Result<T> {
+        let toml = T::default();
         let config_file = toml::to_string(&toml)?;
         let config_file = toml::to_string(&toml)?;
 
 
         if let Some(outdir) = path.parent() {
         if let Some(outdir) = path.parent() {
@@ -44,6 +40,18 @@ impl DrkConfig {
     }
     }
 }
 }
 
 
+use std::path::PathBuf;
+
+#[derive(Serialize, Deserialize, Debug)]
+pub struct DrkConfig {
+    #[serde(default)]
+    pub rpc_url: String,
+
+    #[serde(default)]
+    pub log_path: String,
+}
+
+
 impl Default for DrkConfig {
 impl Default for DrkConfig {
     fn default() -> Self {
     fn default() -> Self {
         let rpc_url = String::from("http://127.0.0.1:8000");
         let rpc_url = String::from("http://127.0.0.1:8000");
@@ -79,29 +87,6 @@ pub struct DarkfidConfig {
     pub password: String,
     pub password: String,
 }
 }
 
 
-impl DarkfidConfig {
-    pub fn load(path: PathBuf) -> Result<Self> {
-        let toml = fs::read(&path)?;
-        let str_buff = str::from_utf8(&toml)?;
-        let config: Self = toml::from_str(str_buff)?;
-        Ok(config)
-    }
-    pub fn load_default(path: PathBuf) -> Result<Self> {
-        let toml = Self::default();
-        let config_file = toml::to_string(&toml)?;
-
-        if let Some(outdir) = path.parent() {
-            create_dir_all(outdir)?;
-        }
-
-        let mut file = File::create(path.clone())?;
-        file.write_all(&config_file.into_bytes())?;
-
-        let config = Self::load(path)?;
-        Ok(config)
-    }
-}
-
 impl Default for DarkfidConfig {
 impl Default for DarkfidConfig {
     fn default() -> Self {
     fn default() -> Self {
         let connect_url = String::from("127.0.0.1:3333");
         let connect_url = String::from("127.0.0.1:3333");
@@ -113,8 +98,8 @@ impl Default for DarkfidConfig {
             .expect("error during join database_path to config path");
             .expect("error during join database_path to config path");
         let database_path = String::from(
         let database_path = String::from(
             database_path
             database_path
-                .to_str()
-                .expect("error convert Path to String"),
+            .to_str()
+            .expect("error convert Path to String"),
         );
         );
         let log_path = String::from("/tmp/darkfid_service_daemon.log");
         let log_path = String::from("/tmp/darkfid_service_daemon.log");
 
 
@@ -149,29 +134,6 @@ pub struct GatewaydConfig {
     pub log_path: String,
     pub log_path: String,
 }
 }
 
 
-impl GatewaydConfig {
-    pub fn load(path: PathBuf) -> Result<Self> {
-        let toml = fs::read(&path)?;
-        let str_buff = str::from_utf8(&toml)?;
-        let config: Self = toml::from_str(str_buff)?;
-        Ok(config)
-    }
-    pub fn load_default(path: PathBuf) -> Result<Self> {
-        let toml = Self::default();
-        let config_file = toml::to_string(&toml)?;
-
-        if let Some(outdir) = path.parent() {
-            create_dir_all(outdir)?;
-        }
-
-        let mut file = File::create(path.clone())?;
-        file.write_all(&config_file.into_bytes())?;
-
-        let config = Self::load(path)?;
-        Ok(config)
-    }
-}
-
 impl Default for GatewaydConfig {
 impl Default for GatewaydConfig {
     fn default() -> Self {
     fn default() -> Self {
         let accept_url = String::from("127.0.0.1:3333");
         let accept_url = String::from("127.0.0.1:3333");
@@ -206,29 +168,6 @@ pub struct CashierdConfig {
     pub password: String,
     pub password: String,
 }
 }
 
 
-impl CashierdConfig {
-    pub fn load(path: PathBuf) -> Result<Self> {
-        let toml = fs::read(&path)?;
-        let str_buff = str::from_utf8(&toml)?;
-        let config: Self = toml::from_str(str_buff)?;
-        Ok(config)
-    }
-    pub fn load_default(path: PathBuf) -> Result<Self> {
-        let toml = Self::default();
-        let config_file = toml::to_string(&toml)?;
-
-        if let Some(outdir) = path.parent() {
-            create_dir_all(outdir)?;
-        }
-
-        let mut file = File::create(path.clone())?;
-        file.write_all(&config_file.into_bytes())?;
-
-        let config = Self::load(path)?;
-        Ok(config)
-    }
-}
-
 impl Default for CashierdConfig {
 impl Default for CashierdConfig {
     fn default() -> Self {
     fn default() -> Self {
         let accept_url = String::from("127.0.0.1:7777");
         let accept_url = String::from("127.0.0.1:7777");

+ 1 - 1
src/cli/mod.rs

@@ -5,7 +5,7 @@ pub mod drk_cli;
 pub mod gatewayd_cli;
 pub mod gatewayd_cli;
 
 
 pub use cashierd_cli::CashierdCli;
 pub use cashierd_cli::CashierdCli;
-pub use cli_config::{CashierdConfig, DarkfidConfig, DrkConfig, GatewaydConfig};
+pub use cli_config::{CashierdConfig, DarkfidConfig, DrkConfig, GatewaydConfig, Config};
 pub use darkfid_cli::DarkfidCli;
 pub use darkfid_cli::DarkfidCli;
 pub use drk_cli::DrkCli;
 pub use drk_cli::DrkCli;
 pub use drk_cli::Transfer;
 pub use drk_cli::Transfer;