#[derive(Debug)]
pub enum Envar<'a> {
Bool(&'a str),
String(&'a str),
U16(&'a str),
}
#[derive(Debug)]
pub enum LoadedEnvar<'a> {
String(&'a str, String),
Bool(&'a str, bool),
U16(&'a str, u16),
}
impl<'a> Envar<'a> {
pub fn load(&self) -> Result<LoadedEnvar, Box<dyn std::error::Error>> {
let key = match self {
Envar::String(key) |
Envar::Bool(key) |
Envar::U16(key) => *key,
};
let raw = std::env::var(key)?;
match self {
Envar::String(_) => {
let val = raw;
Ok(LoadedEnvar::String(key, val))
},
Envar::Bool(_) => {
let val = raw.parse::<bool>()?;
Ok(LoadedEnvar::Bool(key, val))
},
Envar::U16(_) => {
let val = raw.parse::<u16>()?;
Ok(LoadedEnvar::U16(key, val))
},
}
}
}
impl<'a> LoadedEnvar<'a> {
pub fn export(&self) {
let (key, val) = match self {
LoadedEnvar::String(key, val) => (*key, val.clone()),
LoadedEnvar::Bool(key, val) => (*key, val.to_string()),
LoadedEnvar::U16(key, val) => (*key, val.to_string()),
};
println!("cargo:rustc-env={}={}", key, val);
}
}
pub fn init() -> Result<std::path::PathBuf, dotenvy::Error> {
dotenvy::dotenv()
}