use crate::vars::VarEnv;
#[doc(hidden)]
pub trait EnvResolver: Send + Sync {
fn resolve(&self, name: &str) -> Option<String>;
}
impl EnvResolver for VarEnv {
fn resolve(&self, name: &str) -> Option<String> {
self.get(name).map(str::to_owned)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn var_env_blanket_impl_resolves_present() {
let mut e = VarEnv::new();
e.insert("FOO", "bar");
assert_eq!(EnvResolver::resolve(&e, "FOO"), Some("bar".to_owned()));
assert_eq!(e.get("FOO"), Some("bar"));
}
#[test]
fn var_env_blanket_impl_returns_none_for_absent() {
let e = VarEnv::new();
assert_eq!(EnvResolver::resolve(&e, "NOPE"), None);
}
#[test]
fn trait_is_object_safe() {
let e = VarEnv::new();
let _: &dyn EnvResolver = &e;
}
#[test]
fn resolver_value_matches_var_env_get() {
let mut e = VarEnv::new();
e.insert("ALPHA", "one");
e.insert("BETA", "two");
for name in ["ALPHA", "BETA", "MISSING"] {
assert_eq!(e.resolve(name), e.get(name).map(str::to_owned));
}
}
}