invr 0.2.3

Declarative data validation engine using invariants executed on Polars DataFrames.
use crate::report::ReportError;
use crate::spec::error::SpecError;
use std::{error::Error, fmt};

#[derive(Debug)]
pub enum ApplicationError {
    InvalidSpec(SpecError),
    InvalidReport(ReportError),
    EngineFailure(String),
}

impl ApplicationError {
    pub fn engine_failure(msg: impl Into<String>) -> Self {
        Self::EngineFailure(msg.into())
    }
}

impl fmt::Display for ApplicationError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            ApplicationError::InvalidSpec(e) => write!(f, "invalid spec: {e}"),
            ApplicationError::InvalidReport(e) => write!(f, "invalid report: {e}"),
            ApplicationError::EngineFailure(msg) => write!(f, "engine failure: {msg}"),
        }
    }
}

impl Error for ApplicationError {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        match self {
            ApplicationError::InvalidSpec(e) => Some(e),
            ApplicationError::InvalidReport(e) => Some(e),
            ApplicationError::EngineFailure(_) => None,
        }
    }
}

pub type ApplicationResult<T> = Result<T, ApplicationError>;