use std::error::Error;
use std::fmt::{Debug, Display, Formatter};
use itertools::Itertools;
use crate::outcome::Failure;
#[derive(Debug, thiserror::Error)]
pub enum FickleError {
#[error("Parameters are invalid: {0}")]
InvalidParams(String),
}
#[derive(Debug, Clone)]
pub struct TooManyFailures<E, P> {
failures: Vec<Failure<E, P>>,
}
impl<E, P> TooManyFailures<E, P> {
pub fn failures(&self) -> &[Failure<E, P>] {
&self.failures
}
}
impl<E: Display, P: Debug> Display for TooManyFailures<E, P> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let fails = Itertools::intersperse(
self.failures.iter().map(|fail| format!(" - {fail}")),
"\n".into(),
)
.collect::<String>();
write!(f, "Too many failures:\n{}", fails)
}
}
impl<E: Debug + Display, P: Debug> Error for TooManyFailures<E, P> {}
impl<E, P> From<Vec<Failure<E, P>>> for TooManyFailures<E, P> {
fn from(value: Vec<Failure<E, P>>) -> Self {
TooManyFailures { failures: value }
}
}