Skip to content
Snippets Groups Projects
Commit b1693573 authored by Éloïs's avatar Éloïs
Browse files

[feat] core: load module conf from env var as a priority

parent 8930d579
No related branches found
No related tags found
No related merge requests found
...@@ -1028,6 +1028,7 @@ dependencies = [ ...@@ -1028,6 +1028,7 @@ dependencies = [
"durs-module 0.3.0-dev", "durs-module 0.3.0-dev",
"durs-network 0.3.0-dev", "durs-network 0.3.0-dev",
"durs-network-documents 0.4.0", "durs-network-documents 0.4.0",
"envy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"fern 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", "fern 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
...@@ -1111,6 +1112,7 @@ dependencies = [ ...@@ -1111,6 +1112,7 @@ dependencies = [
"dup-crypto 0.7.0", "dup-crypto 0.7.0",
"durs-common-tools 0.2.0", "durs-common-tools 0.2.0",
"durs-network-documents 0.4.0", "durs-network-documents 0.4.0",
"envy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
......
...@@ -24,6 +24,7 @@ durs-message = { path = "../message" } ...@@ -24,6 +24,7 @@ durs-message = { path = "../message" }
durs-module = { path = "../module" } durs-module = { path = "../module" }
durs-network = { path = "../network" } durs-network = { path = "../network" }
durs-network-documents = { path = "../../dunp/network-documents" } durs-network-documents = { path = "../../dunp/network-documents" }
envy = "0.4.1"
failure = "0.1.5" failure = "0.1.5"
fern = { version = "0.5.8", features = ["colored"] } fern = { version = "0.5.8", features = ["colored"] }
log = "0.4.*" log = "0.4.*"
......
...@@ -44,6 +44,7 @@ use crate::errors::DursCoreError; ...@@ -44,6 +44,7 @@ use crate::errors::DursCoreError;
use dubp_currency_params::CurrencyName; use dubp_currency_params::CurrencyName;
use durs_bc::{dbex::DbExQuery, BlockchainModule}; use durs_bc::{dbex::DbExQuery, BlockchainModule};
use durs_common_tools::fatal_error; use durs_common_tools::fatal_error;
use durs_common_tools::traits::merge::Merge;
pub use durs_conf::{ pub use durs_conf::{
constants::KEYPAIRS_FILENAME, keypairs::cli::*, ChangeGlobalConf, DuRsConf, DuniterKeyPairs, constants::KEYPAIRS_FILENAME, keypairs::cli::*, ChangeGlobalConf, DuRsConf, DuniterKeyPairs,
}; };
...@@ -574,19 +575,42 @@ pub fn get_module_conf_and_keys<M: DursModule<DuRsConf, DursMsg>>( ...@@ -574,19 +575,42 @@ pub fn get_module_conf_and_keys<M: DursModule<DuRsConf, DursMsg>>(
)) ))
} }
fn get_env_module_user_conf<ModuleUserConf: serde::de::DeserializeOwned>(
module_name: ModuleStaticName,
) -> Result<ModuleUserConf, ModuleConfError> {
let prefix = format!(
"{}{}",
durs_conf::constants::DURS_ENV_PREFIX,
module_name.0.to_ascii_uppercase()
);
envy::prefixed(prefix)
.from_env::<ModuleUserConf>()
.map_err(ModuleConfError::EnvyErr)
}
/// get module conf /// get module conf
pub fn get_module_conf<M: DursModule<DuRsConf, DursMsg>>( pub fn get_module_conf<M: DursModule<DuRsConf, DursMsg>>(
currency_name: Option<&CurrencyName>, currency_name: Option<&CurrencyName>,
global_conf: &<DuRsConf as DursConfTrait>::GlobalConf, global_conf: &<DuRsConf as DursConfTrait>::GlobalConf,
module_conf_json: Option<serde_json::Value>, module_conf_json: Option<serde_json::Value>,
) -> Result<(M::ModuleConf, Option<M::ModuleUserConf>), ModuleConfError> { ) -> Result<(M::ModuleConf, Option<M::ModuleUserConf>), ModuleConfError> {
if let Some(module_conf_json) = module_conf_json { let file_module_user_conf: M::ModuleUserConf = if let Some(module_conf_json) = module_conf_json
let module_user_conf: Option<M::ModuleUserConf> = {
let file_module_user_conf_opt: Option<M::ModuleUserConf> =
serde_json::from_str(module_conf_json.to_string().as_str())?; serde_json::from_str(module_conf_json.to_string().as_str())?;
M::generate_module_conf(currency_name, global_conf, module_user_conf) file_module_user_conf_opt.unwrap_or_default()
} else { } else {
M::generate_module_conf(currency_name, global_conf, None) M::ModuleUserConf::default()
} };
let env_module_user_conf = get_env_module_user_conf::<M::ModuleUserConf>(M::name())?;
M::generate_module_conf(
currency_name,
global_conf,
Some(file_module_user_conf.merge(env_module_user_conf)),
)
} }
/// Launch databases explorer /// Launch databases explorer
......
...@@ -15,6 +15,7 @@ dubp-currency-params = { path = "../../dubp/currency-params" } ...@@ -15,6 +15,7 @@ dubp-currency-params = { path = "../../dubp/currency-params" }
dubp-user-docs = { path = "../../dubp/user-docs" } dubp-user-docs = { path = "../../dubp/user-docs" }
durs-common-tools = { path = "../../tools/common-tools" } durs-common-tools = { path = "../../tools/common-tools" }
durs-network-documents = { path = "../../dunp/network-documents" } durs-network-documents = { path = "../../dunp/network-documents" }
envy = "0.4.1"
failure = "0.1.5" failure = "0.1.5"
log = "0.4.*" log = "0.4.*"
serde = "1.0.*" serde = "1.0.*"
......
...@@ -362,6 +362,9 @@ pub enum ModuleConfError { ...@@ -362,6 +362,9 @@ pub enum ModuleConfError {
/// Cause /// Cause
cause: String, cause: String,
}, },
/// Error when get conf from environment variables
#[fail(display = "Error when get conf from environment variables: {}", _0)]
EnvyErr(envy::Error),
/// Invalid field /// Invalid field
#[fail(display = "Field '{}' is invalid: {}", field_name, cause)] #[fail(display = "Field '{}' is invalid: {}", field_name, cause)]
InvalidField { InvalidField {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment