env_newtype! {
pub struct TaskEnv;
}
impl TaskEnv {
#[inline]
pub fn single<K, V>(key: K, value: V) -> Self
where
K: Into<String>,
V: Into<String>,
{
let mut env = Self::new();
env.push(key, value);
env
}
}
#[cfg(test)]
mod tests {
use super::TaskEnv;
#[test]
fn constructors_iteration_and_lookup_preserve_last_value() {
let mut env = TaskEnv::new();
assert!(env.is_empty());
env.push("FOO", "one");
env.push("BAR", "x");
env.push("FOO", "two");
assert_eq!(env.len(), 3);
assert_eq!(env.iter().next().unwrap().key(), "FOO");
assert_eq!(env.get("FOO"), Some("two"));
assert_eq!(env.get("BAR"), Some("x"));
assert!(env.get("BAZ").is_none());
let single = TaskEnv::single("ONLY", "value");
assert_eq!(single.len(), 1);
assert_eq!(single.get("ONLY"), Some("value"));
}
#[test]
fn serde_is_transparent_and_preserves_entries() {
let mut env = TaskEnv::new();
env.push("FOO", "bar");
env.push("BAZ", "qux");
let json = serde_json::to_string(&env).unwrap();
assert_eq!(
json,
r#"[{"key":"FOO","value":"bar"},{"key":"BAZ","value":"qux"}]"#
);
let back: TaskEnv = serde_json::from_str(&json).unwrap();
assert_eq!(back, env);
}
}