1#[cfg(test)]
2mod tests;
3
4use std::collections::HashMap;
5
6pub trait EnvProvider {
8 fn var(&self, name: &str) -> Option<String>;
9
10 fn set_var(&mut self, name: &str, value: &str);
11}
12
13#[derive(Debug, Clone, Copy)]
16pub struct ProcessEnvProvider;
17
18impl EnvProvider for ProcessEnvProvider {
19 fn var(&self, name: &str) -> Option<String> {
20 std::env::var_os(name).map(|v| v.to_string_lossy().into())
21 }
22
23 fn set_var(&mut self, name: &str, value: &str) {
24 std::env::set_var(name, value)
25 }
26}
27
28impl EnvProvider for HashMap<String, String> {
29 fn var(&self, name: &str) -> Option<String> {
30 self.get(name).map(ToOwned::to_owned)
31 }
32
33 fn set_var(&mut self, name: &str, value: &str) {
34 self.insert(name.to_owned(), value.to_owned());
35 }
36}