femstache 0.1.13

Embrace the feminine mustache to unlock your templating dreams! Or something, I don't know. :3
Documentation
use core::fmt;
use std::error::Error as StdError;

use femstache_eval::EvalError;
use femstache_loader::LoaderError;
use femstache_types::TyErrors;

/// An error type covering errors in various `femstache` sub-crates
#[derive(Debug)]
pub enum FemstacheError {
    /// An evaluation error from `femstache-eval`
    EvalError(EvalError),
    /// A type error from `femstache-types`
    TypeError(TyErrors),
    /// A loader error from `femstache-loader`
    LoaderError(LoaderError),
    VarNotFound(String),
    VarInvalidType(String),
}

impl StdError for FemstacheError {
    fn source(&self) -> Option<&(dyn StdError + 'static)> {
        match self {
            FemstacheError::EvalError(eval_error) => Some(eval_error),
            FemstacheError::TypeError(ty_error) => Some(ty_error),
            FemstacheError::LoaderError(loader_error) => Some(loader_error),
            FemstacheError::VarNotFound(_) | FemstacheError::VarInvalidType(_) => None,
        }
    }
}

impl fmt::Display for FemstacheError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            FemstacheError::EvalError(eval_error) => {
                write!(f, "eval error: {}", eval_error)
            }
            FemstacheError::TypeError(ty_error) => {
                write!(f, "type errors: {}", ty_error)
            }
            FemstacheError::LoaderError(loader_error) => {
                write!(f, "loader error: {}", loader_error)
            }
            FemstacheError::VarNotFound(name) => write!(f, "variable {name:?} not found"),
            FemstacheError::VarInvalidType(name) => {
                write!(f, "variable {name:?} has an invalid type")
            }
        }
    }
}

impl From<EvalError> for FemstacheError {
    fn from(err: EvalError) -> Self {
        FemstacheError::EvalError(err)
    }
}

impl From<TyErrors> for FemstacheError {
    fn from(errs: TyErrors) -> Self {
        FemstacheError::TypeError(errs)
    }
}

impl From<LoaderError> for FemstacheError {
    fn from(err: LoaderError) -> Self {
        FemstacheError::LoaderError(err)
    }
}

pub type FemstacheResult<T> = Result<T, FemstacheError>;