Struct error_reporter::Report
source · pub struct Report<E = Box<dyn Error>> { /* private fields */ }
Expand description
An error reporter that prints an error and its sources.
Report also exposes configuration options for formatting the error sources, either entirely on a single line, or in multi-line format with each source on a new line.
Report
only requires that the wrapped error implement Error
. It doesn’t require that the
wrapped error be Send
, Sync
, or 'static
.
Examples
use std::error::Error;
use error_reporter::Report;
use std::fmt;
#[derive(Debug)]
struct SuperError {
source: SuperErrorSideKick,
}
impl fmt::Display for SuperError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "SuperError is here!")
}
}
impl Error for SuperError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
Some(&self.source)
}
}
#[derive(Debug)]
struct SuperErrorSideKick;
impl fmt::Display for SuperErrorSideKick {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "SuperErrorSideKick is here!")
}
}
impl Error for SuperErrorSideKick {}
fn get_super_error() -> Result<(), SuperError> {
Err(SuperError { source: SuperErrorSideKick })
}
fn main() {
match get_super_error() {
Err(e) => println!("Error: {}", Report::new(e)),
_ => println!("No error"),
}
}
This example produces the following output:
Error: SuperError is here!: SuperErrorSideKick is here!
Output consistency
Report prints the same output via Display
and Debug
, so it works well with
Result::unwrap
/Result::expect
which print their Err
variant via Debug
:
use error_reporter::Report;
get_super_error().map_err(Report::new).unwrap();
This example produces the following output:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: SuperError is here!: SuperErrorSideKick is here!', src/error.rs:34:40
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Return from main
Report
also implements From
for all types that implement Error
; this when combined with
the Debug
output means Report
is an ideal starting place for formatting errors returned
from main
.
use error_reporter::Report;
fn main() -> Result<(), Report<SuperError>> {
get_super_error()?;
Ok(())
}
This example produces the following output:
Error: SuperError is here!: SuperErrorSideKick is here!
Note: Report
s constructed via ?
and From
will be configured to use the single line
output format. If you want to make sure your Report
s are pretty printed
you will need to manually convert and enable those flags.
use error_reporter::Report;
fn main() -> Result<(), Report<SuperError>> {
get_super_error()
.map_err(Report::from)
.map_err(|r| r.pretty(true))?;
Ok(())
}
This example produces the following output:
Error: SuperError is here!
Caused by:
SuperErrorSideKick is here!
Implementations§
source§impl<E> Report<E>
impl<E> Report<E>
sourcepub fn pretty(self, pretty: bool) -> Self
pub fn pretty(self, pretty: bool) -> Self
Enable pretty-printing the report across multiple lines.
Examples
use error_reporter::Report;
let error = SuperError { source: SuperErrorSideKick };
let report = Report::new(error).pretty(true);
eprintln!("Error: {report:?}");
This example produces the following output:
Error: SuperError is here!
Caused by:
SuperErrorSideKick is here!
When there are multiple source errors the causes will be numbered in order of iteration starting from the outermost error.
use error_reporter::Report;
let source = SuperErrorSideKickSideKick;
let source = SuperErrorSideKick { source };
let error = SuperError { source };
let report = Report::new(error).pretty(true);
eprintln!("Error: {report:?}");
This example produces the following output:
Error: SuperError is here!
Caused by:
0: SuperErrorSideKick is here!
1: SuperErrorSideKickSideKick is here!