diff --git a/src/context.rs b/src/context.rs index 267b7f4..447c149 100644 --- a/src/context.rs +++ b/src/context.rs @@ -2,7 +2,7 @@ use crate::error::ContextError; use crate::{Context, Error}; use std::convert::Infallible; use std::error::Error as StdError; -use std::fmt::{self, Debug, Display}; +use std::fmt::{self, Debug, Display, Write}; #[cfg(backtrace)] use std::backtrace::Backtrace; @@ -103,7 +103,7 @@ where { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("Error") - .field("context", &self.context.to_string()) + .field("context", &Quoted(&self.context)) .field("source", &self.error) .finish() } @@ -147,6 +147,26 @@ where } } +struct Quoted(C); + +impl Debug for Quoted +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 { use super::*;