fickle 0.3.0

Tools for handling fickle (flaky) tests in rust.
Documentation
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 }
    }
}