use std::{error::Error, fmt};
#[derive(Debug)]
pub enum RenderTemplateError {
InvalidFormat(String, String),
VariableNotFound(String),
AllVariablesNotFound(Vec<String>),
TransformerError(TransformerError),
}
#[derive(Debug)]
pub enum TransformerError {
UnknownTranformer(String, String),
TooManyArguments(&'static str, usize, usize),
TooFewArguments(&'static str, usize, usize),
InvalidValueType(&'static str, &'static str),
InvalidArgumentType(&'static str, String, &'static str),
}
impl Error for RenderTemplateError {}
impl Error for TransformerError {}
impl From<TransformerError> for RenderTemplateError {
fn from(item: TransformerError) -> Self {
Self::TransformerError(item)
}
}
impl fmt::Display for TransformerError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::UnknownTranformer(fun, val) => {
write!(f, "{fun} transformer not found for value {val}")
}
Self::TooManyArguments(fun, r, g) => {
write!(f, "{fun} takes at max {r} arguments {g} given")
}
Self::TooFewArguments(fun, r, g) => {
write!(f, "{fun} needs at least {r} arguments {g} given")
}
Self::InvalidValueType(fun, t) => write!(f, "{fun} can only tranform {t} type values"),
Self::InvalidArgumentType(fun, g, t) => {
write!(f, "{fun} argument {g} needs to be of {t} type")
}
}
}
}
impl fmt::Display for RenderTemplateError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::InvalidFormat(fstr, msg) => {
write!(f, "Invalid Template: {fstr} => {msg}")
}
Self::VariableNotFound(var) => {
write!(f, "Variable {var} not found")
}
Self::AllVariablesNotFound(vars) => {
write!(f, "None of the variables {vars:?} found")
}
Self::TransformerError(e) => e.fmt(f),
}
}
}