use crate::stub::Stub;
use anyhow::{bail, Result};
use handlebars_misc_helpers;
pub const MARKDOWN_TEMPLATE: &str = include_str!(std::concat!(
std::env!("CARGO_MANIFEST_DIR"),
"/src/templates/markdown.hbs"
));
pub const ORG_TEMPLATE: &str = include_str!(std::concat!(
std::env!("CARGO_MANIFEST_DIR"),
"/src/templates/org.hbs"
));
pub const PICO8_TEMPLATE: &str = include_str!(std::concat!(
std::env!("CARGO_MANIFEST_DIR"),
"/src/templates/pico8.hbs"
));
pub trait Render {
fn render(&mut self, template: String) -> Result<String>;
fn render_to(&mut self, format: String) -> Result<String>;
}
impl Render for Stub {
fn render(&mut self, template: String) -> Result<String> {
let mut hbs = handlebars_misc_helpers::new_hbs();
handlebars_misc_helpers::register(&mut hbs);
hbs.register_template_string("stub", template)?;
let context = serde_json::value::to_value(self)?;
match hbs.render("stub", &context) {
Ok(c) => Ok(c.to_string()),
Err(err) => bail!("Could not render stub! {:?}", err),
}
}
fn render_to(&mut self, format: String) -> Result<String> {
match format.as_str() {
"md" => self.render(String::from(MARKDOWN_TEMPLATE)),
"org" => self.render(String::from(ORG_TEMPLATE)),
"pico8" => self.render(String::from(PICO8_TEMPLATE)),
&_ => bail!("Unknown output type '{}'", format),
}
}
}