use std::sync::OnceLock;
use crate::engine::CleaverEngine;
static mut CLEAVER: OnceLock<Cleaver> = OnceLock::new();
#[derive(Default)]
pub struct Cleaver {
pub engine: CleaverEngine,
}
impl Cleaver {
pub fn new() -> Self {
Cleaver {
engine: CleaverEngine::new(),
}
}
pub fn instance() -> &'static Self {
unsafe {
CLEAVER.get_or_init(Cleaver::new)
}
}
pub fn render_raw(template: &str, data: serde_json::Value) -> String {
Self::instance().engine.render_raw(template, data)
}
fn render(name: &str, data: serde_json::Value) -> String {
Self::instance().engine.render(name, data)
}
}
#[cfg(test)]
mod tests {
use serde_json::json;
use super::*;
#[test]
fn simple() {
let result = Cleaver::render_raw("Hello, {{ message }}", json!({
"message": "world!"
}));
assert_eq!(result, "Hello, world!");
}
#[test]
fn template_file() {
let result = Cleaver::render("template01", json!({
"message": "world!"
}));
assert_eq!(result, "Hello, world!");
}
#[test]
fn nested() {
let result = Cleaver::render_raw("Hello, {{ message.name }}", json!({
"message": {
"name": "world!"
}
}));
assert_eq!(result, "Hello, world!");
}
#[test]
fn deep_nested() {
let result = Cleaver::render_raw("Hello, {{ message.content.name }}", json!({
"message": {
"content": {
"name": "world!"
}
}
}));
assert_eq!(result, "Hello, world!");
}
}