From caa79d5ba25d3a35030b767dd70fef40e195cae1 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 2 May 2020 15:55:38 -0400 Subject: [PATCH 1/3] Moving towards a generic trait wrapper to call between dynamic and static dispatch functions. --- src/renderer/context_element.rs | 3 ++- src/renderer/renderer.rs | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) 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..418abc8 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, @@ -117,7 +135,7 @@ impl<'a> DustRenderer<'a> { 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("")); From 7b87e30ff92de63bbadb0f180a6b397150d7c6f8 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 2 May 2020 16:04:10 -0400 Subject: [PATCH 2/3] Fixed returns but hitting lifetime issue --- src/renderer/renderer.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 418abc8..c115155 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -130,7 +130,7 @@ impl<'a> DustRenderer<'a> { }; } else { match container.contents { - None => Ok("".to_owned()), + None => return Ok("".to_owned()), Some(body) => { let rendered_results: Result, RenderError> = loop_elements @@ -141,7 +141,6 @@ impl<'a> DustRenderer<'a> { return Ok(rendered_slice.join("")); } }; - return Ok("".to_owned()); } } } From 9a261aa870fae1f8173d248c4430cf332f136778 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 2 May 2020 16:08:39 -0400 Subject: [PATCH 3/3] Fixed lifetime issue --- src/renderer/renderer.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index c115155..957bc4a 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -62,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, { @@ -78,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, { @@ -94,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, { @@ -129,7 +129,7 @@ impl<'a> DustRenderer<'a> { None => Ok("".to_owned()), }; } else { - match container.contents { + match &container.contents { None => return Ok("".to_owned()), Some(body) => { let rendered_results: Result, RenderError> =