quickstart_lib/template/
mod.rs1mod engine;
7mod loader;
8mod variables;
9
10pub use engine::TemplateEngine;
11pub use loader::TemplateLoader;
12pub use variables::TemplateVariables;
13
14#[derive(Debug, Clone, Copy)]
16pub enum TemplateVariant {
17 Minimal,
19 Extended,
21}
22
23impl Default for TemplateVariant {
24 fn default() -> Self {
25 Self::Extended
26 }
27}
28
29#[derive(Debug, thiserror::Error)]
31pub enum TemplateError {
32 #[error("Failed to load template at {path}: {source}")]
34 LoadError {
35 path: String,
37 source: std::io::Error,
39 },
40
41 #[error("Failed to render template {name}: {source}")]
43 RenderError {
44 name: String,
46 source: handlebars::RenderError,
48 },
49
50 #[error("Template not found: {path}")]
52 TemplateNotFound {
53 path: String,
55 },
56}
57
58pub type Result<T> = std::result::Result<T, TemplateError>;
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64 use handlebars::RenderErrorReason;
65 use pretty_assertions::assert_eq;
66 use std::fmt::Debug;
67 use std::io;
68
69 #[test]
70 fn test_template_variant_enum() {
71 let _min = TemplateVariant::Minimal;
72 let _ext = TemplateVariant::Extended;
73 assert_eq!(
74 TemplateVariant::default() as u8,
75 TemplateVariant::Extended as u8
76 );
77 }
78
79 #[test]
80 fn test_template_error_variants() {
81 let err = TemplateError::LoadError {
83 path: "foo".to_string(),
84 source: io::Error::other("fail"),
85 };
86 assert!(format!("{err}").contains("Failed to load template"));
87
88 let render_err = TemplateError::RenderError {
90 name: "bar".to_string(),
91 source: handlebars::RenderError::from(RenderErrorReason::Other("fail".into())),
92 };
93 assert!(format!("{render_err}").contains("Failed to render template"));
94
95 let not_found = TemplateError::TemplateNotFound {
97 path: "baz".to_string(),
98 };
99 assert!(format!("{not_found}").contains("Template not found"));
100 }
101
102 #[test]
103 fn test_result_type() {
104 fn takes_result<T: Debug>(r: Result<T>) -> bool {
105 r.is_ok()
106 }
107 let ok: Result<u8> = Ok(42);
108 let err: Result<u8> = Err(TemplateError::TemplateNotFound { path: "x".into() });
109 assert!(takes_result(ok));
110 assert!(!takes_result(err));
111 }
112}