use std::collections::HashMap;
use std::env;
use std::str::FromStr;
mod macros;
#[cfg(feature = "b32")]
mod b32;
#[cfg(feature = "b58")]
mod b58;
#[cfg(feature = "b64")]
mod b64u;
#[cfg(feature = "b32")]
pub use b32::*;
#[cfg(feature = "b58")]
pub use b58::*;
#[cfg(feature = "b64")]
pub use b64u::*;
pub fn get(name: &'static str) -> Result<String> {
env::var(name).map_err(|_| Error::MissingEnv(name))
}
pub fn get_parse<T: FromStr>(name: &'static str) -> Result<T> {
let val = get(name)?;
val.parse::<T>().map_err(|_| Error::WrongFormat(name))
}
fn read_keys(name: &'static str) -> Result<Vec<(String, String)>> {
let keys = env::var(name).map_err(|_| Error::MissingEnv(name))?;
let mut result = Vec::new();
for pair in keys.split(',') {
let mut split = pair.split(':');
if let (Some(key), Some(value)) = (split.next(), split.next()) {
result.push((key.trim().to_string(), value.trim().to_string()));
} else {
return Err(Error::WrongFormat(name)); }
}
Ok(result)
}
pub fn get_keys(name: &'static str) -> Result<HashMap<String, String>> {
Ok(read_keys(name)?.into_iter().collect())
}
pub fn get_keys_parse<T: FromStr>(name: &'static str) -> Result<HashMap<String, T>> {
let mut hash_map = HashMap::new();
for (key, value) in read_keys(name)? {
let value = value.parse::<T>().map_err(|_| Error::WrongFormat(name))?;
hash_map.insert(key, value);
}
Ok(hash_map)
}
pub type Result<T> = core::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
MissingEnv(&'static str),
WrongFormat(&'static str),
}
impl core::fmt::Display for Error {
fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::result::Result<(), core::fmt::Error> {
write!(fmt, "{self:?}")
}
}
impl std::error::Error for Error {}
#[cfg(test)]
mod tests {
use super::*;
use std::env;
#[test]
fn test_get() {
env::set_var("TEST_VAR", "test_value");
let result = get("TEST_VAR");
assert!(result.is_ok());
assert_eq!(result.unwrap(), "test_value");
let result = get("NON_EXISTENT_VAR");
assert!(result.is_err());
}
#[test]
fn test_get_parse() {
env::set_var("TEST_INT", "42");
let result: Result<i32> = get_parse("TEST_INT");
assert!(result.is_ok());
assert_eq!(result.unwrap(), 42);
env::set_var("TEST_INVALID", "not_a_number");
let result: Result<i32> = get_parse("TEST_INVALID");
assert!(result.is_err());
}
#[test]
fn test_get_keys() {
env::set_var("TEST_KEYS", "KEY1:VALUE1,KEY2:VALUE2");
let result = get_keys("TEST_KEYS");
assert!(result.is_ok());
let map = result.unwrap();
assert_eq!(map.get("KEY1"), Some(&"VALUE1".to_string()));
assert_eq!(map.get("KEY2"), Some(&"VALUE2".to_string()));
let result = get_keys("NON_EXISTENT_KEYS");
assert!(result.is_err());
}
#[test]
fn test_get_keys_parse() {
env::set_var("TEST_KEYS_PARSE", "KEY1:1,KEY2:2");
let result: Result<HashMap<String, i32>> = get_keys_parse("TEST_KEYS_PARSE");
assert!(result.is_ok());
let map = result.unwrap();
assert_eq!(map.get("KEY1"), Some(&1));
assert_eq!(map.get("KEY2"), Some(&2));
env::set_var("TEST_INVALID_KEYS", "KEY1:not_a_number");
let result: Result<HashMap<String, i32>> = get_keys_parse("TEST_INVALID_KEYS");
assert!(result.is_err());
}
}