use std::env::VarError;
pub trait EnvBackend {
fn var(&self, var: &str) -> Result<String, VarError>;
fn set_var(&mut self, var: &str, value: &str);
fn remove(&mut self, var: &str);
}
pub(crate) struct StdEnvBackend;
impl EnvBackend for StdEnvBackend {
fn var(&self, var: &str) -> Result<String, VarError> {
std::env::var(var)
}
fn set_var(&mut self, var: &str, value: &str) {
unsafe { std::env::set_var(var, value) };
}
fn remove(&mut self, var: &str) {
unsafe { std::env::remove_var(var) };
}
}
#[derive(Default)]
pub struct MockEnvBackend {
vars: std::collections::HashMap<String, String>,
}
impl EnvBackend for MockEnvBackend {
fn var(&self, var: &str) -> Result<String, VarError> {
self.vars.get(var).cloned().ok_or(VarError::NotPresent)
}
fn set_var(&mut self, var: &str, value: &str) {
self.vars.insert(var.to_string(), value.to_string());
}
fn remove(&mut self, var: &str) {
self.vars.remove(var);
}
}