cleaver 0.0.1

Template engine
Documentation
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!");
    }
}