rs_minijinja_eval/
lib.rs

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}