pub mod errors;
pub mod number;
pub mod variables;
use handlebars::Handlebars;
use serde::Serialize;
use crate::{
errors::{RenderError, TemplateError},
variables::Variables,
};
pub const DEFAULT_TEMPLATE_NAME: &str = "default";
#[derive(Debug, Clone)]
pub struct PipelineConfig<'a> {
pub template_engine: &'a TemplateEngine<'a>,
pub maybe_template_name: Option<&'a str>,
pub variables: Variables,
}
impl<'a> PipelineConfig<'a> {
pub fn render(&self) -> Result<String, RenderError> {
self.template_engine.render(
self.maybe_template_name.unwrap_or(DEFAULT_TEMPLATE_NAME),
&self.variables,
)
}
}
#[derive(Debug, Clone)]
pub enum TemplateEngine<'a> {
Handlebars(Handlebars<'a>),
}
impl<'a> TemplateEngine<'a> {
pub fn new_handlebars_engine() -> Self {
Self::Handlebars(Handlebars::new())
}
pub fn register_default_template_string(
&mut self,
template: &str,
) -> Result<(), TemplateError> {
self.register_template_string(DEFAULT_TEMPLATE_NAME, template)
}
pub fn register_template_string(
&mut self,
name: &str,
template: &str,
) -> Result<(), TemplateError> {
match self {
Self::Handlebars(registry) => registry
.register_template_string(name, template)
.map_err(Into::into),
}
}
pub fn render<T: Serialize>(
&self,
template_name: &str,
data: &T,
) -> Result<String, RenderError> {
match self {
Self::Handlebars(registry) => {
if !registry.has_template(template_name) {
return Err(RenderError::NoSuchTemplate(template_name.to_string()));
}
registry.render(template_name, data).map_err(Into::into)
}
}
}
}
#[cfg(test)]
mod test {
use crate::{PipelineConfig, TemplateEngine, variables::Variables};
#[test]
fn rendering_simple_handlebars_template_works() {
let mut template_engine = TemplateEngine::new_handlebars_engine();
template_engine
.register_default_template_string("Hello {{name}}! Today is {{day_of_week}}.")
.unwrap();
let mut variables = Variables::new();
variables.set("name", "Michael");
variables.set("day_of_week", "Wednesday");
let pipeline_config = PipelineConfig {
template_engine: &template_engine,
maybe_template_name: None,
variables,
};
let rendered = pipeline_config.render().unwrap();
assert_eq!(rendered, "Hello Michael! Today is Wednesday.");
}
}