# 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
-// 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.
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
},
}
use backtrace::Backtrace;
+use eyre::Chain;
+use indenter::indented;
+#[derive(Debug)]
struct EyreDedupHandler {
backtrace: Backtrace,
}
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) {