80 lines
2.0 KiB
Rust
80 lines
2.0 KiB
Rust
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<T: Serialize>(&self, data: &T) -> Result<String> {
|
|
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<String>,
|
|
}
|
|
|
|
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: "<b>Alice</b> 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 <b>Alice</b> Allison, I am 21 years old and i like cats dogs rust "
|
|
);
|
|
}
|
|
}
|