pinch/plugins/
handlebars.rs

1use crate::plugins::PluginDefinition;
2use crate::plugins::PluginRole::Transform;
3use crate::{utils, InputFile};
4use handlebars::Handlebars;
5use serde_json::json;
6
7pub fn plugin() -> PluginDefinition {
8    PluginDefinition {
9        name: "handlebars".to_string(),
10        role: Transform,
11        output_filename: None,
12        process: None,
13        pre_process: Some(|config, context| {
14            let mut new_files: Vec<InputFile> = vec![];
15            for file in config.files.as_ref().unwrap() {
16                if file.is_extension(".mustache") {
17                    let file_contents = file.read_contents();
18
19                    let template_registry = Handlebars::new();
20                    let template = template_registry
21                        .render_template(file_contents.as_str(), &json!(&context))
22                        .unwrap();
23
24                    let new_file = file.replace_extensions("");
25                    utils::create_file(new_file.path.to_string(), template);
26                    new_files.push(new_file);
27                }
28            }
29            (context, Some(new_files))
30        }),
31        applies: None,
32        post_process: Some(|config, _context| {
33            for file in config.files.as_ref().unwrap() {
34                if file.is_extension(".mustache") {
35                    utils::remove_file(file.replace_path_extension(""))
36                }
37            }
38        }),
39    }
40}