use crate::ffi::OsString; use crate::{fmt, vec}; pub struct Env { iter: vec::IntoIter<(OsString, OsString)>, } // FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when ::fmt matches ::fmt. pub struct EnvStrDebug<'a> { slice: &'a [(OsString, OsString)], } impl fmt::Debug for EnvStrDebug<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list() .entries(self.slice.iter().map(|(a, b)| (a.to_str().unwrap(), b.to_str().unwrap()))) .finish() } } impl Env { pub(super) fn new(env: Vec<(OsString, OsString)>) -> Self { Env { iter: env.into_iter() } } pub fn str_debug(&self) -> impl fmt::Debug + '_ { EnvStrDebug { slice: self.iter.as_slice() } } } impl fmt::Debug for Env { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.iter.as_slice()).finish() } } impl !Send for Env {} impl !Sync for Env {} impl Iterator for Env { type Item = (OsString, OsString); fn next(&mut self) -> Option<(OsString, OsString)> { self.iter.next() } fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } }