From: Ian Jackson Date: Sat, 7 Aug 2021 16:03:40 +0000 (+0100) Subject: eyre: deup printing, yay X-Git-Tag: hippotat/1.0.0~284 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=23d8ed58effd45ca0477a7610493b876532756e6;p=hippotat.git eyre: deup printing, yay Signed-off-by: Ian Jackson --- diff --git a/src/reporter.rs b/src/reporter.rs index 938a4d8..8a92b39 100644 --- a/src/reporter.rs +++ b/src/reporter.rs @@ -92,7 +92,7 @@ impl<'r> Reporter<'r> { write!(m, " ({}ok)", self.successes)?; self.successes = 0; } - write!(m, ": {:?}", e)?; + write!(m, ": {}", e)?; Ok::<_,fmt::Error>(m) })().unwrap(); warn!(target:"hippotat", "{}", m); @@ -115,6 +115,22 @@ struct EyreDedupHandler { type EyreDynError<'r> = &'r (dyn std::error::Error + 'static); impl eyre::EyreHandler for EyreDedupHandler { + #[throws(fmt::Error)] + fn display(&self, error: EyreDynError, f: &mut fmt::Formatter) { + let mut last: Option = None; + let mut error = Some(error); + while let Some(e) = error { + let m = e.to_string(); + match last { + None => write!(f, "{}", m)?, + Some(l) if l.contains(&m) => { }, + Some(_) => write!(f, ": {}", m)?, + } + last = Some(m); + error = e.source(); + } + } + #[throws(fmt::Error)] fn debug(&self, error: EyreDynError, f: &mut fmt::Formatter) { if f.alternate() { @@ -141,10 +157,6 @@ impl eyre::EyreHandler for EyreDedupHandler { backtrace.resolve(); write!(f, "\n\nStack backtrace:\n{:?}", backtrace)?; } - #[throws(fmt::Error)] - fn display(&self, error: EyreDynError, f: &mut fmt::Formatter) { - Display::fmt(error, f)?; - } } #[throws(AE)]