use handlebars::Handlebars; use serde::Serialize; use crate::{error::Result, site::Site}; pub struct Template { pub template_string: String, } impl Template { pub fn new(template_string: String) -> Self { Self { template_string } } pub fn generate(&self, data: &T) -> Result { let reg = Handlebars::new(); let output = reg.render_template(&self.template_string, data)?; Ok(output) } } #[cfg(test)] mod tests { use super::*; use serde::Serialize; #[derive(Serialize)] struct TestData { name: String, age: i32, tags: Vec, } impl Default for TestData { fn default() -> Self { Self { name: "Alice Allison".to_string(), age: 21, tags: vec!["cats".to_string(), "dogs".to_string(), "rust".to_string()], } } } #[test] fn test_template() { let tmpl = Template::new( "Hello, my name is {{ name }}, I am {{ age }} years old and i like {{#each tags}}{{this}} {{/each}}" .to_string(), ); let res = tmpl .generate(&TestData::default()) .expect("Error parsing template"); assert_eq!( res, "Hello, my name is Alice Allison, I am 21 years old and i like cats dogs rust " ); } #[test] fn html_inclusion() { let data = TestData { name: "Alice Allison".to_string(), ..Default::default() }; let tmpl = Template::new( "Hello, my name is {{{ name }}}, I am {{ age }} years old and i like {{#each tags}}{{this}} {{/each}}" .to_string(), ); let res = tmpl.generate(&data).expect("Error parsing template"); assert_eq!( res, "Hello, my name is Alice Allison, I am 21 years old and i like cats dogs rust " ); } }