refac: change env_or macro
This commit is contained in:
parent
7fbb400214
commit
5993375bff
2 changed files with 72 additions and 7 deletions
|
@ -412,7 +412,7 @@ macro_rules! __itconfig_parse_variables {
|
||||||
unparsed_meta = $unparsed_meta:tt,
|
unparsed_meta = $unparsed_meta:tt,
|
||||||
meta = $meta:tt,
|
meta = $meta:tt,
|
||||||
unparsed_concat = [
|
unparsed_concat = [
|
||||||
$concat_param:tt,
|
$concat_param:tt$( => $default:expr)?,
|
||||||
$($rest:tt)*
|
$($rest:tt)*
|
||||||
],
|
],
|
||||||
concat = [$($concat:expr,)*],
|
concat = [$($concat:expr,)*],
|
||||||
|
@ -425,7 +425,7 @@ macro_rules! __itconfig_parse_variables {
|
||||||
unparsed_meta = $unparsed_meta,
|
unparsed_meta = $unparsed_meta,
|
||||||
meta = $meta,
|
meta = $meta,
|
||||||
unparsed_concat = [$($rest)*],
|
unparsed_concat = [$($rest)*],
|
||||||
concat = [$($concat,)* __itconfig_concat_param!($concat_param),],
|
concat = [$($concat,)* __itconfig_concat_param!($concat_param$( => $default)?),],
|
||||||
$($current_variable)*
|
$($current_variable)*
|
||||||
},
|
},
|
||||||
$($args)*
|
$($args)*
|
||||||
|
@ -565,9 +565,20 @@ macro_rules! __itconfig_impl {
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
macro_rules! __itconfig_concat_param {
|
macro_rules! __itconfig_concat_param {
|
||||||
($env:ident) => ( env_or!(stringify!($env).to_uppercase()) );
|
($env_name:ident => $default:expr) => {
|
||||||
|
__itconfig_env_or!(stringify!($env_name).to_uppercase(), $default, default)
|
||||||
|
};
|
||||||
|
|
||||||
|
($env_name:ident) => {
|
||||||
|
env_or!(stringify!($env_name).to_uppercase())
|
||||||
|
};
|
||||||
|
|
||||||
($str:expr) => ( $str.to_string() );
|
($str:expr) => ( $str.to_string() );
|
||||||
|
|
||||||
|
// Invalid syntax
|
||||||
|
($($tokens:tt)*) => {
|
||||||
|
__itconfig_invalid_syntax!();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -607,7 +618,7 @@ macro_rules! __itconfig_variable {
|
||||||
pub fn $name() -> $ty {
|
pub fn $name() -> $ty {
|
||||||
let value_parts: Vec<String> = vec!($($concat),+);
|
let value_parts: Vec<String> = vec!($($concat),+);
|
||||||
let value = value_parts.join("");
|
let value = value_parts.join("");
|
||||||
env_or!(@default $env_name, value)
|
__itconfig_env_or!(@setenv $env_name, value)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -650,23 +661,50 @@ macro_rules! __itconfig_variable {
|
||||||
/// ```
|
/// ```
|
||||||
#[macro_export(local_inner_macro)]
|
#[macro_export(local_inner_macro)]
|
||||||
macro_rules! env_or {
|
macro_rules! env_or {
|
||||||
|
// Env without default value
|
||||||
($env_name:expr) => {
|
($env_name:expr) => {
|
||||||
env_or!($env_name, format!(r#"Cannot read "{}" environment variable"#, $env_name), panic);
|
__itconfig_env_or!($env_name, format!(r#"Cannot read "{}" environment variable"#, $env_name), panic);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Env with default value
|
||||||
($env_name:expr, $default:expr) => {
|
($env_name:expr, $default:expr) => {
|
||||||
env_or!($env_name, $default, default);
|
__itconfig_env_or!($env_name, $default, setenv);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Invalid syntax
|
||||||
|
($($tokens:tt)*) => {
|
||||||
|
__itconfig_env_or_invalid_syntax!();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
#[doc(hidden)]
|
||||||
|
macro_rules! __itconfig_env_or_invalid_syntax {
|
||||||
|
() => {
|
||||||
|
compile_error!(
|
||||||
|
"Invalid `env_or!` syntax. Please see the `env_or!` macro docs for more info.\
|
||||||
|
`https://docs.rs/itconfig/latest/itconfig/macro.env_or.html`"
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! __itconfig_env_or {
|
||||||
($env_name:expr, $default:expr, $token:tt) => {{
|
($env_name:expr, $default:expr, $token:tt) => {{
|
||||||
use std::env;
|
use std::env;
|
||||||
use itconfig::EnvValue;
|
use itconfig::EnvValue;
|
||||||
env::var($env_name)
|
env::var($env_name)
|
||||||
.map(|val| EnvValue::from(val).into())
|
.map(|val| EnvValue::from(val).into())
|
||||||
.unwrap_or_else(|_| env_or!(@$token $env_name, $default))
|
.unwrap_or_else(|_| __itconfig_env_or!(@$token $env_name, $default))
|
||||||
}};
|
}};
|
||||||
|
|
||||||
(@default $env_name:expr, $default:expr) => {{
|
(@default $env_name:expr, $default:expr) => {{
|
||||||
|
$default
|
||||||
|
}};
|
||||||
|
|
||||||
|
(@setenv $env_name:expr, $default:expr) => {{
|
||||||
env::set_var($env_name, $default.to_string());
|
env::set_var($env_name, $default.to_string());
|
||||||
$default
|
$default
|
||||||
}};
|
}};
|
||||||
|
@ -674,5 +712,10 @@ macro_rules! env_or {
|
||||||
(@panic $env_name:expr, $default:expr) => {
|
(@panic $env_name:expr, $default:expr) => {
|
||||||
panic!($default);
|
panic!($default);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Invalid syntax
|
||||||
|
($($tokens:tt)*) => {
|
||||||
|
__itconfig_env_or_invalid_syntax!();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -315,3 +315,25 @@ fn concatenate_not_defined_environment_variables() {
|
||||||
cfg::init();
|
cfg::init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn default_value_for_concatenate_env_parameter() {
|
||||||
|
config! {
|
||||||
|
CONCATENATED_DATABASE_URL < (
|
||||||
|
"postgres://",
|
||||||
|
NOT_DEFINED_PG_USERNAME => "user".to_string(),
|
||||||
|
":",
|
||||||
|
NOT_DEFINED_PG_PASSWORD => "pass".to_string(),
|
||||||
|
"@",
|
||||||
|
NOT_DEFINED_PG_HOST => "localhost:5432".to_string(),
|
||||||
|
"/",
|
||||||
|
NOT_DEFINED_PG_DB => "test".to_string(),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg::init();
|
||||||
|
assert_eq!(
|
||||||
|
env::var("CONCATENATED_DATABASE_URL"),
|
||||||
|
Ok("postgres://user:pass@localhost:5432/test".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Reference in a new issue