1use std::io;
2
3use io::BufWriter;
4use io::Write;
5
6use io::Read;
7
8use minijinja::Environment;
9use minijinja::Template;
10use minijinja::Value;
11
12pub fn render_with_value(tmpl: &Template, val: &Value) -> Result<String, minijinja::Error> {
13 tmpl.render(val)
14}
15
16pub fn add_tmpl<'a>(
17 env: &mut Environment<'a>,
18 name: &'a str,
19 source: &'a str,
20) -> Result<(), minijinja::Error> {
21 env.add_template(name, source)
22}
23
24pub fn get_tmpl<'a>(
25 env: &'a Environment,
26 name: &str,
27) -> Result<Template<'a, 'a>, minijinja::Error> {
28 env.get_template(name)
29}
30
31pub const TEMPLATE_NAME_DEFAULT: &str = "default_template_name";
32
33pub fn eval2writer<W>(name: String, source: String, ctx: Value, mut wtr: W) -> Result<(), io::Error>
34where
35 W: Write,
36{
37 let mut env: Environment = Environment::new();
38 env.add_template(&name, &source).map_err(io::Error::other)?;
39 let tmpl: Template = env.get_template(&name).map_err(io::Error::other)?;
40 tmpl.render_to_write(ctx, &mut wtr)
41 .map_err(io::Error::other)?;
42 wtr.flush()?;
43 Ok(())
44}
45
46pub fn eval2stdout(name: String, source: String, ctx: Value) -> Result<(), io::Error> {
47 let o = io::stdout();
48 let mut ol = o.lock();
49 let bw = BufWriter::new(&mut ol);
50 eval2writer(name, source, ctx, bw)?;
51 ol.flush()
52}
53
54#[derive(serde::Deserialize)]
55pub struct Input {
56 pub name: String,
57 pub source: String,
58 pub ctx: serde_json::Value,
59}
60
61pub fn stdin2stdout(limit: u64) -> Result<(), io::Error> {
62 let i = io::stdin();
63 let il = i.lock();
64 let mut taken = il.take(limit);
65 let mut buf: Vec<u8> = vec![];
66 taken.read_to_end(&mut buf)?;
67 let input: Input = serde_json::from_slice(&buf)?;
68 eval2stdout(input.name, input.source, json2value(input.ctx))
69}
70
71pub fn eval_from_reader_with_limit<R: Read>(reader: R, limit: u64) -> Result<String, io::Error> {
72 let mut taken = reader.take(limit);
73 let mut buf: Vec<u8> = vec![];
74 taken.read_to_end(&mut buf)?;
75 let input: Input = serde_json::from_slice(&buf)?;
76 let mut env = Environment::new();
77 env.add_template(&input.name, &input.source)
78 .map_err(io::Error::other)?;
79 let tmpl = env.get_template(&input.name).map_err(io::Error::other)?;
80 let value = json2value(input.ctx);
81 tmpl.render(value).map_err(io::Error::other)
82}
83
84pub fn ser2val<S>(ctx: S) -> Value
85where
86 S: serde::Serialize,
87{
88 Value::from_serialize(ctx)
89}
90
91pub fn json2value(jval: serde_json::Value) -> Value {
92 ser2val(jval)
93}