use crate::GeneratedValue;
pub type Result<T> = std::result::Result<T, Error>;
pub struct Error {
seed: u64,
case_index: usize,
kind: ErrorKind,
generated: Vec<GeneratedValue>,
}
enum ErrorKind {
Panic { message: String },
}
impl Error {
pub(crate) fn from_panic(
seed: u64,
case_index: usize,
message: String,
generated: Vec<GeneratedValue>,
) -> Self {
Self {
seed,
case_index,
kind: ErrorKind::Panic { message },
generated,
}
}
pub fn seed(&self) -> u64 {
self.seed
}
pub fn case_index(&self) -> usize {
self.case_index
}
pub fn generated(&self) -> &[GeneratedValue] {
&self.generated
}
}
impl std::fmt::Debug for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let ErrorKind::Panic { message } = &self.kind;
writeln!(f, "Error {{")?;
writeln!(f, " seed: {:#018x},", self.seed)?;
writeln!(f, " case_index: {},", self.case_index)?;
writeln!(f, " panic: {message:?},")?;
if self.generated.is_empty() {
writeln!(f, " generated: [],")?;
} else {
writeln!(f, " generated: [")?;
for entry in &self.generated {
writeln!(f, " {entry:?}")?;
}
writeln!(f, " ],")?;
}
write!(f, "}}")
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let ErrorKind::Panic { message } = &self.kind;
writeln!(
f,
"noprop failure at case {} (seed={:#018x}): {}",
self.case_index, self.seed, message
)?;
if !self.generated.is_empty() {
writeln!(f, "Generated values:")?;
for entry in &self.generated {
writeln!(f, " {entry:?}")?;
}
}
Ok(())
}
}
impl std::error::Error for Error {}