1use crate::{
2 panic::{rust_backtrace, PanicError},
3 Seed,
4};
5use core::fmt::{Debug, Display};
6
7#[derive(Debug)]
9pub struct Failure<Input> {
10 pub error: PanicError,
11 pub input: Input,
12 pub seed: Option<Seed>,
13}
14
15impl<Input: Debug> Display for Failure<Input> {
16 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17 writeln!(
18 f,
19 "\n======================== Test Failure ========================\n"
20 )?;
21 if let Some(seed) = &self.seed {
22 writeln!(f, "BOLERO_RANDOM_SEED={seed}\n")?;
23 }
24
25 writeln!(f, "Input: \n{:#?}\n", self.input)?;
26 writeln!(f, "Error: \n{}", self.error)?;
27
28 if f.alternate() {
29 if let Some(backtrace) = self.error.backtrace.as_ref().filter(|_| rust_backtrace()) {
30 writeln!(f, "{backtrace}")?;
31 } else {
32 writeln!(f, "note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.")?;
33 }
34 }
35
36 writeln!(
37 f,
38 "\n=============================================================="
39 )?;
40 Ok(())
41 }
42}
43
44impl<Input: Debug> std::error::Error for Failure<Input> {}