chiark / gitweb /
eyre: wip backtrace, c&p from example
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Aug 2021 15:52:05 +0000 (16:52 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 7 Aug 2021 15:59:22 +0000 (16:59 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Cargo.lock
Cargo.toml
src/reporter.rs

index 98af578ed4627d2f98fb486567cb017a412f44a2..3ffac8c9e2d204da23b1939ba49ca79f1fbc5980 100644 (file)
@@ -429,6 +429,7 @@ dependencies = [
  "hippotat-macros",
  "hyper",
  "hyper-tls",
+ "indenter",
  "ipnet",
  "itertools",
  "lazy-regex",
index 0649f6e313f1fe3370e622cfc38cc9ab85611b4f..7c7135408b6623756132ba41f8b96769b251c38a 100644 (file)
@@ -47,8 +47,8 @@ void = "1"
 
 # Not in sid:
 extend = "1"           # no deps not in sid
-eyre = "0.6"           # deps not in sid: 
-# indenter             # no deps not in sid
+eyre = "0.6"           # deps not in sid: indenter
+indenter = "0.3"       # no deps not in sid
 fehler = "1"           # no deps (other than fehler-macros, obvs)
 lazy-regex = "2"       # no deps not in sid
 cervine = "0.0"                # no (non-dev)-deps not in sid
index 29bf1cc340a94f121d4145c6d4fa9846471efe72..926b094e46d9408eff26ac89caf6122da3c5120b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2021 Ian Jackson and contributors to Hippotat
+// Copyright 2021 Ian Jackson, yaahc and contributors to Hippotat and Eyre
 // SPDX-License-Identifier: GPL-3.0-or-later
 // There is NO WARRANTY.
 
@@ -92,10 +92,10 @@ 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);
+        warn!(target:"hippotat", "{}", m);
         self.last_report = Some(Report { when: now, ok: Err(()) });
         None
       },
@@ -104,7 +104,10 @@ impl<'r> Reporter<'r> {
 }
 
 use backtrace::Backtrace;
+use eyre::Chain;
+use indenter::indented;
 
+#[derive(Debug)]
 struct EyreDedupHandler {
   backtrace: Backtrace,
 }
@@ -114,7 +117,28 @@ type EyreDynError<'r> = &'r (dyn std::error::Error + 'static);
 impl eyre::EyreHandler for EyreDedupHandler {
   #[throws(fmt::Error)]
   fn debug(&self, error: EyreDynError, f: &mut fmt::Formatter) {
-    Debug::fmt(error, f)?;
+        if f.alternate() {
+            return core::fmt::Debug::fmt(error, f)?;
+        }
+
+        write!(f, "{}", error)?;
+
+        if let Some(cause) = error.source() {
+            write!(f, "\n\nCaused by:")?;
+            let multiple = cause.source().is_some();
+
+            for (n, error) in Chain::new(cause).enumerate() {
+                writeln!(f)?;
+                if multiple {
+                    write!(indented(f).ind(n), "{}", error)?;
+                } else {
+                    write!(indented(f), "{}", error)?;
+                }
+            }
+        }
+
+        let backtrace = &self.backtrace;
+        write!(f, "\n\nStack backtrace:\n{:?}", backtrace)?;
   }
   #[throws(fmt::Error)]
   fn display(&self, error: EyreDynError, f: &mut fmt::Formatter) {