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}