diff --git a/src/renderer/context_element.rs b/src/renderer/context_element.rs index 14f1aae..0dccc2c 100644 --- a/src/renderer/context_element.rs +++ b/src/renderer/context_element.rs @@ -1,8 +1,9 @@ use crate::parser::Filter; use crate::renderer::errors::RenderError; +use crate::renderer::renderer::RenderWrapper; use std::fmt::Debug; -pub trait ContextElement: Debug + Walkable + Renderable + Loopable {} +pub trait ContextElement: Debug + RenderWrapper + Walkable + Renderable + Loopable {} pub trait Walkable { fn walk(&self, segment: &str) -> Result<&dyn ContextElement, RenderError>; diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index b98e77c..957bc4a 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -19,6 +19,24 @@ pub struct DustRenderer<'a> { templates: HashMap>, } +pub trait RenderWrapper { + fn render_body<'a>( + &'a self, + renderer: &'a DustRenderer, + body: &Body, + ) -> Result; +} + +impl RenderWrapper for C { + fn render_body<'a>( + &'a self, + renderer: &'a DustRenderer, + body: &Body, + ) -> Result> { + renderer.render_body(body, self) + } +} + pub fn compile_template<'a>( source: &'a str, name: String, @@ -44,7 +62,7 @@ impl<'a> DustRenderer<'a> { .insert(template.name.clone(), &template.template); } - pub fn render(&self, name: &str, context: &'a C) -> Result> + pub fn render(&'a self, name: &str, context: &'a C) -> Result> where C: ContextElement, { @@ -60,7 +78,7 @@ impl<'a> DustRenderer<'a> { self.render_body(&main_template.contents, context) } - fn render_body(&self, body: &Body, context: &'a C) -> Result> + fn render_body(&'a self, body: &Body, context: &'a C) -> Result> where C: ContextElement, { @@ -76,7 +94,7 @@ impl<'a> DustRenderer<'a> { Ok(output) } - fn render_tag(&self, tag: &DustTag, context: &'a C) -> Result> + fn render_tag(&'a self, tag: &DustTag, context: &'a C) -> Result> where C: ContextElement, { @@ -111,19 +129,18 @@ impl<'a> DustRenderer<'a> { None => Ok("".to_owned()), }; } else { - match container.contents { - None => Ok("".to_owned()), + match &container.contents { + None => return Ok("".to_owned()), Some(body) => { let rendered_results: Result, RenderError> = loop_elements .into_iter() - .map(|array_elem| self.render_body(&body, array_elem)) + .map(|array_elem| array_elem.render_body(self, &body)) .collect(); let rendered_slice: &[String] = &rendered_results?; return Ok(rendered_slice.join("")); } }; - return Ok("".to_owned()); } } }