use std::ffi::OsString;
pub trait EnvReader: Send + Sync {
fn var(&self, key: &str) -> Result<String, std::env::VarError>;
fn var_os(&self, key: &str) -> Option<OsString>;
}
#[derive(Clone, Default, Debug)]
pub struct RealEnvReader;
impl EnvReader for RealEnvReader {
fn var(&self, key: &str) -> Result<String, std::env::VarError> {
std::env::var(key)
}
fn var_os(&self, key: &str) -> Option<OsString> {
std::env::var_os(key)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_real_env_reader_reads_actual_env() {
let reader = RealEnvReader;
std::env::set_var("PRODIGY_TEST_ENV_READER", "test_value");
let value = reader.var("PRODIGY_TEST_ENV_READER").unwrap();
assert_eq!(value, "test_value");
std::env::remove_var("PRODIGY_TEST_ENV_READER");
}
#[test]
fn test_real_env_reader_returns_error_for_missing() {
let reader = RealEnvReader;
match reader.var("PRODIGY_NONEXISTENT_VAR_12345") {
Err(std::env::VarError::NotPresent) => {
}
other => panic!("Expected NotPresent error, got: {:?}", other),
}
}
#[test]
fn test_real_env_reader_var_os() {
let reader = RealEnvReader;
std::env::set_var("PRODIGY_TEST_OS_VAR", "test_value");
let value = reader.var_os("PRODIGY_TEST_OS_VAR");
assert_eq!(value, Some(OsString::from("test_value")));
std::env::remove_var("PRODIGY_TEST_OS_VAR");
}
#[test]
fn test_real_env_reader_var_os_missing() {
let reader = RealEnvReader;
let value = reader.var_os("PRODIGY_NONEXISTENT_VAR_12345");
assert_eq!(value, None);
}
}