use crate::dae::ast::Dae;
use anyhow::{Context, Result};
use minijinja::{Environment, context};
use std::fs;
pub fn panic(msg: &str) {
panic!("{:?}", msg);
}
pub fn warn(msg: &str) {
eprintln!("{:?}", msg);
}
pub fn render_template(dae: &Dae, template_file: &str) -> Result<()> {
let template_txt = fs::read_to_string(template_file)
.with_context(|| format!("Can't read file {}", template_file))?;
let mut env = Environment::new();
env.add_function("panic", panic);
env.add_function("warn", warn);
env.add_template("template", &template_txt)?;
let tmpl = env.get_template("template")?;
let txt = tmpl
.render(context!(dae => dae))
.expect("template rendering failed");
println!("{}", txt);
Ok(())
}
pub fn render_template_str(dae: &Dae, template_str: &str) -> Result<String> {
let mut env = Environment::new();
env.add_function("panic", panic);
env.add_function("warn", warn);
env.add_template("template", template_str)
.with_context(|| "Template syntax error in template".to_string())?;
let tmpl = env.get_template("template")?;
let txt = tmpl.render(context!(dae => dae)).map_err(|e| {
let detail = if let Some(line) = e.line() {
format!("Line {}: {}", line, e)
} else {
format!("{}", e)
};
anyhow::anyhow!("Template error: {}", detail)
})?;
Ok(txt)
}