pub use const_str;
pub use static_init;
pub use err_exit::err_exit;
pub fn li_no_warn(name: impl AsRef<str>) -> Vec<String> {
let mut r = Vec::new();
let name = name.as_ref();
if let Ok(val) = std::env::var(name) {
for i in val.split_whitespace() {
r.push(i.into());
}
}
r
}
pub fn li(name: impl AsRef<str>) -> Vec<String> {
let name = name.as_ref();
let r = li_no_warn(name);
if r.is_empty() {
log::warn!("⚠️ ENV {name} IS EMPTY");
}
r
}
pub fn get<T: std::str::FromStr>(name: &str) -> T
where
<T as std::str::FromStr>::Err: std::fmt::Debug,
{
let val = std::env::var(name);
match val {
Ok(val) => match val.parse() {
Ok(r) => r,
Err(err) => {
err_exit!("{name}={val} {err:?}");
}
},
Err(err) => {
err_exit!("{err} {name}");
}
}
}
pub fn get_or_default<T: std::str::FromStr>(name: &str, default: T) -> T
where
<T as std::str::FromStr>::Err: std::fmt::Debug,
{
if let Ok(i) = std::env::var(name) {
match i.parse() {
Ok(i) => return i,
Err(err) => log::error!("❌ ENV PARSE ERROR {name}={i} : {:?}", err),
}
}
default
}
#[macro_export]
macro_rules! s {
($name:ident) => {
$crate::s!($name: String);
};
($name:ident: $ty:ty) => {
#[allow(non_upper_case_globals)]
#[$crate::static_init::dynamic]
pub static $name: $ty = $crate::get(stringify!($name));
};
($($name:ident: $type:ty | $default:expr);+ $(;)?) => {
$(
#[$crate::static_init::dynamic]
pub static $name: $type = {
let name = stringify!($name);
std::env::var(name).map(
|i|{
match i.parse(){
Ok(i)=>i,
Err(err) => {
$crate::err_exit!("❌ {name}={i} {:?}", err);
}
}
}
).unwrap_or($default)
};
)+
};
($($name:ident$(:$ty:ty)?),+) => {
$(
$crate::s!($name$(: $ty)?);
)+
};
}
#[macro_export]
macro_rules! def {
($($name:ident: $type:ty | $default:expr);+ $(;)?) => {
$(
#[allow(non_snake_case)]
pub fn $name() -> $type {
$crate::get_or_default(stringify!($name), $default)
}
)+
};
($name:ident) => {
#[allow(non_snake_case)]
pub fn $name<T: std::str::FromStr>() -> T
where <T as std::str::FromStr>::Err: std::fmt::Debug {
$crate::get(stringify!($name))
}
};
($($name:ident),+) => {
$(
$crate::def!($name);
)+
};
}