use std::fmt;
use failure;
use crate::Error;
pub struct DisplayCausesAndBacktrace<'a> {
err: &'a Error,
include_backtrace: bool,
}
impl<'a> fmt::Display for DisplayCausesAndBacktrace<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut first = true;
for cause in self.err.iter_chain() {
if first {
first = false;
writeln!(f, "Error: {}", cause)?;
} else {
writeln!(f, " caused by: {}", cause)?;
}
}
if self.include_backtrace {
write!(f, "{}", self.err.backtrace())?;
}
Ok(())
}
}
pub trait DisplayCausesAndBacktraceExt {
fn display_causes_and_backtrace(&self) -> DisplayCausesAndBacktrace;
fn display_causes_without_backtrace(&self) -> DisplayCausesAndBacktrace;
}
impl DisplayCausesAndBacktraceExt for failure::Error {
fn display_causes_and_backtrace(&self) -> DisplayCausesAndBacktrace {
DisplayCausesAndBacktrace {
err: self,
include_backtrace: true,
}
}
fn display_causes_without_backtrace(&self) -> DisplayCausesAndBacktrace {
DisplayCausesAndBacktrace {
err: self,
include_backtrace: false,
}
}
}