use core::fmt;
use std::error::Error as StdError;
use femstache_eval::EvalError;
use femstache_loader::LoaderError;
use femstache_types::TyErrors;
#[derive(Debug)]
pub enum FemstacheError {
EvalError(EvalError),
TypeError(TyErrors),
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>;