anvil_minijinja/
lib.rs

1use std::io::Write;
2
3use anvil::Anvil;
4use serde::Serialize;
5
6pub mod extensions;
7
8pub trait Shrine: Serialize {
9    fn minijinja(&self, writer: &mut dyn Write) -> Result<(), minijinja::Error>;
10}
11
12pub struct Katana<'a, T: Shrine>(&'a T);
13
14impl<T: Shrine> Anvil for Katana<'_, T> {
15    type Error = minijinja::Error;
16    fn anvil(&self, writer: &mut (impl std::io::Write + Sized)) -> Result<(), Self::Error> {
17        self.0.minijinja(writer)
18    }
19}
20
21pub mod prelude {
22    pub use crate::extensions::{
23        append::{append, MinijinjaAppendExt},
24        generate::{generate, MinijinjaGenerateExt},
25    };
26    pub use crate::Shrine;
27}
28
29#[cfg(test)]
30mod test {
31    use super::*;
32    #[derive(Serialize)]
33    struct TestTemplate {}
34
35    impl Shrine for TestTemplate {
36        fn minijinja(&self, writer: &mut dyn Write) -> Result<(), minijinja::Error> {
37            let mut env = minijinja::Environment::new();
38            env.add_template("test", "Hello, World!")?;
39            let tmpl = env.get_template("test")?;
40            tmpl.render_to_write(self, writer)?;
41            Ok(())
42        }
43    }
44
45    #[test]
46    fn it_renders_template() {
47        let template = TestTemplate {};
48        let mut buf = Vec::new();
49        let aqua = Katana(&template);
50        aqua.anvil(&mut buf).unwrap();
51        let result = String::from_utf8(buf).unwrap();
52        assert_eq!(result, "Hello, World!");
53    }
54}