Better Debug for Vars and VarsOs
Display actual vars instead of two dots.
The same was done for Args and ArgsOs in 275f9a04af
.
This commit is contained in:
parent
fbc11e9690
commit
35c0c03a3c
@ -178,7 +178,8 @@ fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
#[stable(feature = "std_debug", since = "1.16.0")]
|
||||
impl fmt::Debug for Vars {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("Vars").finish_non_exhaustive()
|
||||
let Self { inner: VarsOs { inner } } = self;
|
||||
f.debug_struct("Vars").field("inner", &inner.str_debug()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
@ -196,7 +197,8 @@ fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
#[stable(feature = "std_debug", since = "1.16.0")]
|
||||
impl fmt::Debug for VarsOs {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("VarOs").finish_non_exhaustive()
|
||||
let Self { inner } = self;
|
||||
f.debug_struct("VarsOs").field("inner", inner).finish()
|
||||
}
|
||||
}
|
||||
|
||||
@ -829,7 +831,8 @@ fn next_back(&mut self) -> Option<String> {
|
||||
#[stable(feature = "std_debug", since = "1.16.0")]
|
||||
impl fmt::Debug for Args {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("Args").field("inner", &self.inner.inner).finish()
|
||||
let Self { inner: ArgsOs { inner } } = self;
|
||||
f.debug_struct("Args").field("inner", inner).finish()
|
||||
}
|
||||
}
|
||||
|
||||
@ -870,7 +873,8 @@ fn next_back(&mut self) -> Option<OsString> {
|
||||
#[stable(feature = "std_debug", since = "1.16.0")]
|
||||
impl fmt::Debug for ArgsOs {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("ArgsOs").field("inner", &self.inner).finish()
|
||||
let Self { inner } = self;
|
||||
f.debug_struct("ArgsOs").field("inner", inner).finish()
|
||||
}
|
||||
}
|
||||
|
||||
|
20
library/std/src/env/tests.rs
vendored
20
library/std/src/env/tests.rs
vendored
@ -95,8 +95,28 @@ fn args_debug() {
|
||||
format!("Args {{ inner: {:?} }}", args().collect::<Vec<_>>()),
|
||||
format!("{:?}", args())
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn args_os_debug() {
|
||||
assert_eq!(
|
||||
format!("ArgsOs {{ inner: {:?} }}", args_os().collect::<Vec<_>>()),
|
||||
format!("{:?}", args_os())
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vars_debug() {
|
||||
assert_eq!(
|
||||
format!("Vars {{ inner: {:?} }}", vars().collect::<Vec<_>>()),
|
||||
format!("{:?}", vars())
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vars_os_debug() {
|
||||
assert_eq!(
|
||||
format!("VarsOs {{ inner: {:?} }}", vars_os().collect::<Vec<_>>()),
|
||||
format!("{:?}", vars_os())
|
||||
);
|
||||
}
|
||||
|
@ -112,6 +112,34 @@ pub struct Env {
|
||||
iter: vec::IntoIter<(OsString, OsString)>,
|
||||
}
|
||||
|
||||
// FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when <OsStr as Debug>::fmt matches <str as Debug>::fmt.
|
||||
pub struct EnvStrDebug<'a> {
|
||||
slice: &'a [(OsString, OsString)],
|
||||
}
|
||||
|
||||
impl fmt::Debug for EnvStrDebug<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { slice } = self;
|
||||
f.debug_list()
|
||||
.entries(slice.iter().map(|(a, b)| (a.to_str().unwrap(), b.to_str().unwrap())))
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Env {
|
||||
pub fn str_debug(&self) -> impl fmt::Debug + '_ {
|
||||
let Self { iter } = self;
|
||||
EnvStrDebug { slice: iter.as_slice() }
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Env {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { iter } = self;
|
||||
f.debug_list().entries(iter.as_slice()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl !Send for Env {}
|
||||
impl !Sync for Env {}
|
||||
|
||||
|
@ -96,14 +96,61 @@ fn create_env_store() -> &'static EnvStore {
|
||||
unsafe { &*(ENV.load(Ordering::Relaxed) as *const EnvStore) }
|
||||
}
|
||||
|
||||
pub type Env = vec::IntoIter<(OsString, OsString)>;
|
||||
pub struct Env {
|
||||
iter: vec::IntoIter<(OsString, OsString)>,
|
||||
}
|
||||
|
||||
// FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when <OsStr as Debug>::fmt matches <str as Debug>::fmt.
|
||||
pub struct EnvStrDebug<'a> {
|
||||
slice: &'a [(OsString, OsString)],
|
||||
}
|
||||
|
||||
impl fmt::Debug for EnvStrDebug<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { slice } = self;
|
||||
f.debug_list()
|
||||
.entries(slice.iter().map(|(a, b)| (a.to_str().unwrap(), b.to_str().unwrap())))
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Env {
|
||||
pub fn str_debug(&self) -> impl fmt::Debug + '_ {
|
||||
let Self { iter } = self;
|
||||
EnvStrDebug { slice: iter.as_slice() }
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Env {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { iter } = self;
|
||||
f.debug_list().entries(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<usize>) {
|
||||
self.iter.size_hint()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn env() -> Env {
|
||||
let clone_to_vec = |map: &HashMap<OsString, OsString>| -> Vec<_> {
|
||||
map.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
|
||||
};
|
||||
|
||||
get_env_store().map(|env| clone_to_vec(&env.lock().unwrap())).unwrap_or_default().into_iter()
|
||||
let iter = get_env_store()
|
||||
.map(|env| clone_to_vec(&env.lock().unwrap()))
|
||||
.unwrap_or_default()
|
||||
.into_iter();
|
||||
Env { iter }
|
||||
}
|
||||
|
||||
pub fn getenv(k: &OsStr) -> Option<OsString> {
|
||||
|
@ -85,6 +85,34 @@ pub struct Env {
|
||||
iter: vec::IntoIter<(OsString, OsString)>,
|
||||
}
|
||||
|
||||
// FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when <OsStr as Debug>::fmt matches <str as Debug>::fmt.
|
||||
pub struct EnvStrDebug<'a> {
|
||||
slice: &'a [(OsString, OsString)],
|
||||
}
|
||||
|
||||
impl fmt::Debug for EnvStrDebug<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { slice } = self;
|
||||
f.debug_list()
|
||||
.entries(slice.iter().map(|(a, b)| (a.to_str().unwrap(), b.to_str().unwrap())))
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Env {
|
||||
pub fn str_debug(&self) -> impl fmt::Debug + '_ {
|
||||
let Self { iter } = self;
|
||||
EnvStrDebug { slice: iter.as_slice() }
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Env {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { iter } = self;
|
||||
f.debug_list().entries(iter.as_slice()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl !Send for Env {}
|
||||
impl !Sync for Env {}
|
||||
|
||||
|
@ -495,6 +495,34 @@ pub struct Env {
|
||||
iter: vec::IntoIter<(OsString, OsString)>,
|
||||
}
|
||||
|
||||
// FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when <OsStr as Debug>::fmt matches <str as Debug>::fmt.
|
||||
pub struct EnvStrDebug<'a> {
|
||||
slice: &'a [(OsString, OsString)],
|
||||
}
|
||||
|
||||
impl fmt::Debug for EnvStrDebug<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { slice } = self;
|
||||
f.debug_list()
|
||||
.entries(slice.iter().map(|(a, b)| (a.to_str().unwrap(), b.to_str().unwrap())))
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Env {
|
||||
pub fn str_debug(&self) -> impl fmt::Debug + '_ {
|
||||
let Self { iter } = self;
|
||||
EnvStrDebug { slice: iter.as_slice() }
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Env {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { iter } = self;
|
||||
f.debug_list().entries(iter.as_slice()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl !Send for Env {}
|
||||
impl !Sync for Env {}
|
||||
|
||||
|
@ -65,10 +65,26 @@ pub fn current_exe() -> io::Result<PathBuf> {
|
||||
|
||||
pub struct Env(!);
|
||||
|
||||
impl Env {
|
||||
// FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when <OsStr as Debug>::fmt matches <str as Debug>::fmt.
|
||||
pub fn str_debug(&self) -> impl fmt::Debug + '_ {
|
||||
let Self(inner) = self;
|
||||
match *inner {}
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Env {
|
||||
fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self(inner) = self;
|
||||
match *inner {}
|
||||
}
|
||||
}
|
||||
|
||||
impl Iterator for Env {
|
||||
type Item = (OsString, OsString);
|
||||
fn next(&mut self) -> Option<(OsString, OsString)> {
|
||||
self.0
|
||||
let Self(inner) = self;
|
||||
match *inner {}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -142,10 +142,39 @@ fn description(&self) -> &str {
|
||||
pub fn current_exe() -> io::Result<PathBuf> {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub struct Env {
|
||||
iter: vec::IntoIter<(OsString, OsString)>,
|
||||
}
|
||||
|
||||
// FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when <OsStr as Debug>::fmt matches <str as Debug>::fmt.
|
||||
pub struct EnvStrDebug<'a> {
|
||||
slice: &'a [(OsString, OsString)],
|
||||
}
|
||||
|
||||
impl fmt::Debug for EnvStrDebug<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { slice } = self;
|
||||
f.debug_list()
|
||||
.entries(slice.iter().map(|(a, b)| (a.to_str().unwrap(), b.to_str().unwrap())))
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Env {
|
||||
pub fn str_debug(&self) -> impl fmt::Debug + '_ {
|
||||
let Self { iter } = self;
|
||||
EnvStrDebug { slice: iter.as_slice() }
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Env {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { iter } = self;
|
||||
f.debug_list().entries(iter.as_slice()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl !Send for Env {}
|
||||
impl !Sync for Env {}
|
||||
|
||||
|
@ -85,25 +85,69 @@ pub fn error_string(mut errnum: i32) -> String {
|
||||
|
||||
pub struct Env {
|
||||
base: c::LPWCH,
|
||||
cur: c::LPWCH,
|
||||
iter: EnvIterator,
|
||||
}
|
||||
|
||||
// FIXME(https://github.com/rust-lang/rust/issues/114583): Remove this when <OsStr as Debug>::fmt matches <str as Debug>::fmt.
|
||||
pub struct EnvStrDebug<'a> {
|
||||
iter: &'a EnvIterator,
|
||||
}
|
||||
|
||||
impl fmt::Debug for EnvStrDebug<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { iter } = self;
|
||||
let iter: EnvIterator = (*iter).clone();
|
||||
let mut list = f.debug_list();
|
||||
for (a, b) in iter {
|
||||
list.entry(&(a.to_str().unwrap(), b.to_str().unwrap()));
|
||||
}
|
||||
list.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Env {
|
||||
pub fn str_debug(&self) -> impl fmt::Debug + '_ {
|
||||
let Self { base: _, iter } = self;
|
||||
EnvStrDebug { iter }
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Env {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let Self { base: _, iter } = self;
|
||||
f.debug_list().entries(iter.clone()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Iterator for Env {
|
||||
type Item = (OsString, OsString);
|
||||
|
||||
fn next(&mut self) -> Option<(OsString, OsString)> {
|
||||
let Self { base: _, iter } = self;
|
||||
iter.next()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct EnvIterator(c::LPWCH);
|
||||
|
||||
impl Iterator for EnvIterator {
|
||||
type Item = (OsString, OsString);
|
||||
|
||||
fn next(&mut self) -> Option<(OsString, OsString)> {
|
||||
let Self(cur) = self;
|
||||
loop {
|
||||
unsafe {
|
||||
if *self.cur == 0 {
|
||||
if **cur == 0 {
|
||||
return None;
|
||||
}
|
||||
let p = self.cur as *const u16;
|
||||
let p = *cur as *const u16;
|
||||
let mut len = 0;
|
||||
while *p.add(len) != 0 {
|
||||
len += 1;
|
||||
}
|
||||
let s = slice::from_raw_parts(p, len);
|
||||
self.cur = self.cur.add(len + 1);
|
||||
*cur = cur.add(len + 1);
|
||||
|
||||
// Windows allows environment variables to start with an equals
|
||||
// symbol (in any other position, this is the separator between
|
||||
@ -137,7 +181,7 @@ pub fn env() -> Env {
|
||||
if ch.is_null() {
|
||||
panic!("failure getting env string from OS: {}", io::Error::last_os_error());
|
||||
}
|
||||
Env { base: ch, cur: ch }
|
||||
Env { base: ch, iter: EnvIterator(ch) }
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user