Skip to main content

coil_template/model/
error.rs

1use super::*;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub enum TemplateModelError {
5    EmptyField {
6        field: &'static str,
7    },
8    InvalidToken {
9        field: &'static str,
10        value: String,
11    },
12    DuplicateTemplate {
13        key: TemplateKey,
14    },
15    TemplateNotFound {
16        name: TemplateName,
17    },
18    TemplateKindMismatch {
19        name: TemplateName,
20        expected: TemplateKind,
21        actual: TemplateKind,
22    },
23    MissingValue {
24        key: String,
25    },
26    MissingTranslation {
27        key: String,
28    },
29    MissingSlotFill {
30        slot: SlotName,
31    },
32    TemplateRead {
33        path: String,
34        message: String,
35    },
36    ParseError {
37        line: usize,
38        column: usize,
39        message: String,
40    },
41    FragmentCannotRenderLayout {
42        name: TemplateName,
43    },
44    LayoutCannotBeIncludedAsFragment {
45        name: TemplateName,
46    },
47    InvalidElementName {
48        tag: String,
49    },
50    InvalidAttributeName {
51        name: String,
52    },
53    ValueTypeMismatch {
54        key: String,
55        expected: &'static str,
56    },
57}
58
59impl fmt::Display for TemplateModelError {
60    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61        match self {
62            Self::EmptyField { field } => write!(f, "`{field}` cannot be empty"),
63            Self::InvalidToken { field, value } => {
64                write!(f, "`{field}` contains an invalid token `{value}`")
65            }
66            Self::DuplicateTemplate { key } => write!(f, "template `{key}` is already registered"),
67            Self::TemplateNotFound { name } => write!(f, "template `{name}` was not found"),
68            Self::TemplateKindMismatch {
69                name,
70                expected,
71                actual,
72            } => write!(
73                f,
74                "template `{name}` resolved to kind `{actual}` but `{expected}` was required"
75            ),
76            Self::MissingValue { key } => write!(f, "render value `{key}` was not provided"),
77            Self::MissingTranslation { key } => {
78                write!(f, "translation `{key}` was not provided")
79            }
80            Self::MissingSlotFill { slot } => write!(f, "slot `{slot}` has no fill or fallback"),
81            Self::TemplateRead { path, message } => {
82                write!(f, "failed to read template `{path}`: {message}")
83            }
84            Self::ParseError {
85                line,
86                column,
87                message,
88            } => write!(f, "template parse error at {line}:{column}: {message}"),
89            Self::FragmentCannotRenderLayout { name } => {
90                write!(
91                    f,
92                    "layout template `{name}` cannot be rendered as a fragment"
93                )
94            }
95            Self::LayoutCannotBeIncludedAsFragment { name } => {
96                write!(
97                    f,
98                    "layout template `{name}` cannot be included as a fragment"
99                )
100            }
101            Self::InvalidElementName { tag } => write!(f, "invalid element name `{tag}`"),
102            Self::InvalidAttributeName { name } => write!(f, "invalid attribute name `{name}`"),
103            Self::ValueTypeMismatch { key, expected } => {
104                write!(
105                    f,
106                    "render value `{key}` does not match expected type `{expected}`"
107                )
108            }
109        }
110    }
111}
112
113impl Error for TemplateModelError {}