Remove std dependency from context's Debug impl

Replacing the std-only to_string() call in the previous implementation
is required for introducing no_std support.
This commit is contained in:
David Tolnay 2019-11-27 20:52:11 -08:00
parent 4f123aee8b
commit 2e711d6afa
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82

View File

@ -2,7 +2,7 @@ use crate::error::ContextError;
use crate::{Context, Error}; use crate::{Context, Error};
use std::convert::Infallible; use std::convert::Infallible;
use std::error::Error as StdError; use std::error::Error as StdError;
use std::fmt::{self, Debug, Display}; use std::fmt::{self, Debug, Display, Write};
#[cfg(backtrace)] #[cfg(backtrace)]
use std::backtrace::Backtrace; use std::backtrace::Backtrace;
@ -103,7 +103,7 @@ where
{ {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Error") f.debug_struct("Error")
.field("context", &self.context.to_string()) .field("context", &Quoted(&self.context))
.field("source", &self.error) .field("source", &self.error)
.finish() .finish()
} }
@ -147,6 +147,26 @@ where
} }
} }
struct Quoted<C>(C);
impl<C> Debug for Quoted<C>
where
C: Display,
{
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_char('"')?;
Quoted(&mut *formatter).write_fmt(format_args!("{}", self.0))?;
formatter.write_char('"')?;
Ok(())
}
}
impl Write for Quoted<&mut fmt::Formatter<'_>> {
fn write_str(&mut self, s: &str) -> fmt::Result {
Display::fmt(&s.escape_debug(), self.0)
}
}
pub(crate) mod private { pub(crate) mod private {
use super::*; use super::*;