coil-template 0.1.1

Server-side template parsing and rendering for the Coil framework.
Documentation
use super::*;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TemplateModelError {
    EmptyField {
        field: &'static str,
    },
    InvalidToken {
        field: &'static str,
        value: String,
    },
    DuplicateTemplate {
        key: TemplateKey,
    },
    TemplateNotFound {
        name: TemplateName,
    },
    TemplateKindMismatch {
        name: TemplateName,
        expected: TemplateKind,
        actual: TemplateKind,
    },
    MissingValue {
        key: String,
    },
    MissingTranslation {
        key: String,
    },
    MissingSlotFill {
        slot: SlotName,
    },
    TemplateRead {
        path: String,
        message: String,
    },
    ParseError {
        line: usize,
        column: usize,
        message: String,
    },
    FragmentCannotRenderLayout {
        name: TemplateName,
    },
    LayoutCannotBeIncludedAsFragment {
        name: TemplateName,
    },
    InvalidElementName {
        tag: String,
    },
    InvalidAttributeName {
        name: String,
    },
    ValueTypeMismatch {
        key: String,
        expected: &'static str,
    },
}

impl fmt::Display for TemplateModelError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::EmptyField { field } => write!(f, "`{field}` cannot be empty"),
            Self::InvalidToken { field, value } => {
                write!(f, "`{field}` contains an invalid token `{value}`")
            }
            Self::DuplicateTemplate { key } => write!(f, "template `{key}` is already registered"),
            Self::TemplateNotFound { name } => write!(f, "template `{name}` was not found"),
            Self::TemplateKindMismatch {
                name,
                expected,
                actual,
            } => write!(
                f,
                "template `{name}` resolved to kind `{actual}` but `{expected}` was required"
            ),
            Self::MissingValue { key } => write!(f, "render value `{key}` was not provided"),
            Self::MissingTranslation { key } => {
                write!(f, "translation `{key}` was not provided")
            }
            Self::MissingSlotFill { slot } => write!(f, "slot `{slot}` has no fill or fallback"),
            Self::TemplateRead { path, message } => {
                write!(f, "failed to read template `{path}`: {message}")
            }
            Self::ParseError {
                line,
                column,
                message,
            } => write!(f, "template parse error at {line}:{column}: {message}"),
            Self::FragmentCannotRenderLayout { name } => {
                write!(
                    f,
                    "layout template `{name}` cannot be rendered as a fragment"
                )
            }
            Self::LayoutCannotBeIncludedAsFragment { name } => {
                write!(
                    f,
                    "layout template `{name}` cannot be included as a fragment"
                )
            }
            Self::InvalidElementName { tag } => write!(f, "invalid element name `{tag}`"),
            Self::InvalidAttributeName { name } => write!(f, "invalid attribute name `{name}`"),
            Self::ValueTypeMismatch { key, expected } => {
                write!(
                    f,
                    "render value `{key}` does not match expected type `{expected}`"
                )
            }
        }
    }
}

impl Error for TemplateModelError {}