org-static/src/template.rs

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 "
);
}
}