chiark / gitweb /
eyre: deup printing, yay
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Aug 2021 16:03:40 +0000 (17:03 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Aug 2021 16:03:40 +0000 (17:03 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/reporter.rs

index 938a4d8be4f88148d0b330d88b2ed3e0be984a2c..8a92b39a9866ae079faf5f55a902433393b13889 100644 (file)
@@ -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<String> = 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)]