#![cfg_attr(docsrs, feature(doc_cfg))]
#![deny(missing_docs)]
#![allow(clippy::needless_doctest_main)]
use std::fmt::Write;
use std::fs::{self, DirEntry};
use std::io;
use std::path::Path;
#[macro_export]
macro_rules! embed_templates {
($path:expr, $exts:expr, $bundle_name:expr) => {{
let out_dir = ::std::env::var_os("OUT_DIR").unwrap();
let dst_path = ::std::path::Path::new(&out_dir)
.join(format!("minijinja_templates_{}.rs", $bundle_name));
let generated = $crate::_embed_templates($path, $exts);
println!("cargo:rerun-if-changed={}", $path);
::std::fs::write(dst_path, generated).unwrap();
}};
($path:expr) => {
$crate::embed_templates!($path, &[][..], "main");
};
($path:expr, $exts:expr) => {
$crate::embed_templates!($path, $exts, "main");
};
}
#[macro_export]
macro_rules! load_templates {
($env:expr, $bundle_name:literal) => {{
let load_template = include!(concat!(
env!("OUT_DIR"),
"/minijinja_templates_",
$bundle_name,
".rs"
));
load_template(&mut $env);
}};
($env:expr) => {
$crate::load_templates!($env, "main");
};
}
fn visit_dirs(dir: &Path, cb: &mut dyn FnMut(&DirEntry)) -> io::Result<()> {
if dir.is_dir() {
for entry in fs::read_dir(dir)? {
let entry = entry?;
let path = entry.path();
if path
.file_name()
.and_then(|x| x.to_str())
.is_some_and(|x| x.starts_with('.'))
{
continue;
}
if path.is_dir() {
visit_dirs(&path, cb)?;
} else {
cb(&entry);
}
}
}
Ok(())
}
#[doc(hidden)]
pub fn _embed_templates<P>(path: P, extensions: &[&str]) -> String
where
P: AsRef<Path>,
{
let path = path.as_ref().canonicalize().unwrap();
let mut gen = String::new();
writeln!(gen, "|env: &mut minijinja::Environment| {{").unwrap();
visit_dirs(&path, &mut |f| {
let p = f.path();
if !extensions.is_empty()
&& !p
.file_name()
.and_then(|x| x.to_str())
.is_some_and(|name| extensions.iter().any(|x| name.ends_with(x)))
{
return;
}
let contents = fs::read_to_string(&p).unwrap();
let name = p.strip_prefix(&path).unwrap();
writeln!(
gen,
"env.add_template({:?}, {:?}).expect(\"Embedded an invalid template\");",
name.to_string_lossy().replace('\\', "/"),
contents
)
.unwrap();
})
.unwrap();
writeln!(gen, "}}").unwrap();
gen
}