mod engine;
mod loader;
mod variables;
pub use engine::TemplateEngine;
pub use loader::TemplateLoader;
pub use variables::TemplateVariables;
#[derive(Debug, Clone, Copy)]
pub enum TemplateVariant {
Minimal,
Extended,
}
impl Default for TemplateVariant {
fn default() -> Self {
Self::Extended
}
}
#[derive(Debug, thiserror::Error)]
pub enum TemplateError {
#[error("Failed to load template at {path}: {source}")]
LoadError {
path: String,
source: std::io::Error,
},
#[error("Failed to render template {name}: {source}")]
RenderError {
name: String,
source: handlebars::RenderError,
},
#[error("Template not found: {path}")]
TemplateNotFound {
path: String,
},
}
pub type Result<T> = std::result::Result<T, TemplateError>;
#[cfg(test)]
mod tests {
use super::*;
use handlebars::RenderErrorReason;
use pretty_assertions::assert_eq;
use std::fmt::Debug;
use std::io;
#[test]
fn test_template_variant_enum() {
let _min = TemplateVariant::Minimal;
let _ext = TemplateVariant::Extended;
assert_eq!(
TemplateVariant::default() as u8,
TemplateVariant::Extended as u8
);
}
#[test]
fn test_template_error_variants() {
let err = TemplateError::LoadError {
path: "foo".to_string(),
source: io::Error::other("fail"),
};
assert!(format!("{err}").contains("Failed to load template"));
let render_err = TemplateError::RenderError {
name: "bar".to_string(),
source: handlebars::RenderError::from(RenderErrorReason::Other("fail".into())),
};
assert!(format!("{render_err}").contains("Failed to render template"));
let not_found = TemplateError::TemplateNotFound {
path: "baz".to_string(),
};
assert!(format!("{not_found}").contains("Template not found"));
}
#[test]
fn test_result_type() {
fn takes_result<T: Debug>(r: Result<T>) -> bool {
r.is_ok()
}
let ok: Result<u8> = Ok(42);
let err: Result<u8> = Err(TemplateError::TemplateNotFound { path: "x".into() });
assert!(takes_result(ok));
assert!(!takes_result(err));
}
}