diff --git a/src/renderer/context_element.rs b/src/renderer/context_element.rs index 743f33d..c31ecc9 100644 --- a/src/renderer/context_element.rs +++ b/src/renderer/context_element.rs @@ -1,6 +1,7 @@ use crate::parser::Filter; use crate::renderer::errors::RenderError; use crate::renderer::errors::WalkError; +use crate::renderer::DustRenderer; use std::any::Any; use std::{cmp::Ordering, fmt::Debug}; @@ -101,6 +102,7 @@ impl FromContextElement for C { pub trait IntoContextElement: Debug + Walkable + CloneIntoBoxedContextElement { fn into_context_element( &self, + renderer: &DustRenderer, breadcrumbs: &Vec<&dyn IntoContextElement>, ) -> &dyn ContextElement; } @@ -108,6 +110,7 @@ pub trait IntoContextElement: Debug + Walkable + CloneIntoBoxedContextElement { impl IntoContextElement for C { fn into_context_element( &self, + renderer: &DustRenderer, breadcrumbs: &Vec<&dyn IntoContextElement>, ) -> &dyn ContextElement { self diff --git a/src/renderer/parameters_context.rs b/src/renderer/parameters_context.rs index 7aa0bf8..d4b0020 100644 --- a/src/renderer/parameters_context.rs +++ b/src/renderer/parameters_context.rs @@ -4,6 +4,7 @@ use crate::renderer::context_element::CompareContextElement; use crate::renderer::context_element::ContextElement; use crate::renderer::context_element::IntoContextElement; use crate::renderer::walking::walk_path; +use crate::renderer::DustRenderer; use crate::renderer::Loopable; use crate::renderer::RenderError; use crate::renderer::Renderable; @@ -243,8 +244,10 @@ impl CompareContextElement for OwnedLiteral { impl IntoContextElement for Vec { fn into_context_element( &self, + renderer: &DustRenderer, breadcrumbs: &Vec<&dyn IntoContextElement>, ) -> &dyn ContextElement { + // renderer.render_partial_name(self, // TODO &OwnedLiteral::LPositiveInteger(1) } diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 4ff2efa..9600c81 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -155,7 +155,7 @@ impl<'a> DustRenderer<'a> { DustTag::DTLiteralStringBlock(literal) => return Ok((*literal).to_owned()), DustTag::DTReference(reference) => { let val = walk_path(breadcrumbs, &reference.path.keys) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); match val { Err(WalkError::CantWalk) => return Ok("".to_owned()), Ok(final_val) => { @@ -170,10 +170,10 @@ impl<'a> DustRenderer<'a> { DustTag::DTSection(container) => { let injected_context = ParametersContext::new(breadcrumbs, &container.params); let val = walk_path(breadcrumbs, &container.path.keys) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); match val { Err(WalkError::CantWalk) => { - let new_breadcrumbs = Self::new_breadcrumbs_section( + let new_breadcrumbs = self.new_breadcrumbs_section( breadcrumbs, None, Some(&injected_context), @@ -199,7 +199,7 @@ impl<'a> DustRenderer<'a> { final_val.get_loop_elements(); if loop_elements.is_empty() { // Scalar value - let new_breadcrumbs = Self::new_breadcrumbs_section( + let new_breadcrumbs = self.new_breadcrumbs_section( breadcrumbs, None, Some(&injected_context), @@ -221,8 +221,8 @@ impl<'a> DustRenderer<'a> { .map(|(i, array_elem)| { let index_context = IterationContext::new(i, total_length); - let new_breadcrumbs = - Self::new_breadcrumbs_section( + let new_breadcrumbs = self + .new_breadcrumbs_section( breadcrumbs, Some(&index_context), Some(&injected_context), @@ -248,7 +248,7 @@ impl<'a> DustRenderer<'a> { // an empty array or null), Dust uses the // original context before walking the path as // the context for rendering the else block - let new_breadcrumbs = Self::new_breadcrumbs_section( + let new_breadcrumbs = self.new_breadcrumbs_section( breadcrumbs, None, Some(&injected_context), @@ -265,14 +265,14 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTExists(container) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, &container.explicit_context, ); let val = walk_path(breadcrumbs, &container.path.keys) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); return if val.map(|v| v.is_truthy()).unwrap_or(false) { self.render_maybe_body( &container.contents, @@ -288,14 +288,14 @@ impl<'a> DustRenderer<'a> { }; } DustTag::DTNotExists(container) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, &container.explicit_context, ); let val = walk_path(breadcrumbs, &container.path.keys) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); return if !val.map(|v| v.is_truthy()).unwrap_or(false) { self.render_maybe_body( &container.contents, @@ -313,7 +313,7 @@ impl<'a> DustRenderer<'a> { DustTag::DTPartial(partial) => { let partial_name = self.render_partial_name(&partial.name, breadcrumbs, blocks)?; if partial.params.is_empty() { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, @@ -327,7 +327,7 @@ impl<'a> DustRenderer<'a> { return Ok(rendered_content); } else { let injected_context = ParametersContext::new(breadcrumbs, &partial.params); - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, Some(&injected_context), @@ -346,7 +346,7 @@ impl<'a> DustRenderer<'a> { return Ok("".to_owned()); } DustTag::DTBlock(named_block) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, blocks.breadcrumbs, None, @@ -366,7 +366,7 @@ impl<'a> DustRenderer<'a> { }; } DustTag::DTHelperEquals(parameterized_block) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, @@ -395,12 +395,12 @@ impl<'a> DustRenderer<'a> { let left_side: Result<&dyn ContextElement, WalkError> = match Self::get_rval(breadcrumbs, ¶m_map, "key") { None => return Ok("".to_owned()), - Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)), + Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)), }; let right_side: Result<&dyn ContextElement, WalkError> = Self::get_rval(breadcrumbs, ¶m_map, "value") .unwrap_or(Err(WalkError::CantWalk)) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); if left_side == right_side { return self.render_maybe_body( @@ -417,7 +417,7 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperNotEquals(parameterized_block) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, @@ -446,12 +446,12 @@ impl<'a> DustRenderer<'a> { let left_side: Result<&dyn ContextElement, WalkError> = match Self::get_rval(breadcrumbs, ¶m_map, "key") { None => return Ok("".to_owned()), - Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)), + Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)), }; let right_side: Result<&dyn ContextElement, WalkError> = Self::get_rval(breadcrumbs, ¶m_map, "value") .unwrap_or(Err(WalkError::CantWalk)) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); if left_side != right_side { return self.render_maybe_body( ¶meterized_block.contents, @@ -467,7 +467,7 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperGreaterThan(parameterized_block) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, @@ -478,12 +478,12 @@ impl<'a> DustRenderer<'a> { let left_side: Result<&dyn ContextElement, WalkError> = match Self::get_rval(breadcrumbs, ¶m_map, "key") { None => return Ok("".to_owned()), - Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)), + Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)), }; let right_side: Result<&dyn ContextElement, WalkError> = Self::get_rval(breadcrumbs, ¶m_map, "value") .unwrap_or(Err(WalkError::CantWalk)) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); match (left_side, right_side) { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( @@ -510,7 +510,7 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperGreaterThanOrEquals(parameterized_block) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, @@ -521,12 +521,12 @@ impl<'a> DustRenderer<'a> { let left_side: Result<&dyn ContextElement, WalkError> = match Self::get_rval(breadcrumbs, ¶m_map, "key") { None => return Ok("".to_owned()), - Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)), + Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)), }; let right_side: Result<&dyn ContextElement, WalkError> = Self::get_rval(breadcrumbs, ¶m_map, "value") .unwrap_or(Err(WalkError::CantWalk)) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); match (left_side, right_side) { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( @@ -553,7 +553,7 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperLessThan(parameterized_block) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, @@ -564,12 +564,12 @@ impl<'a> DustRenderer<'a> { let left_side: Result<&dyn ContextElement, WalkError> = match Self::get_rval(breadcrumbs, ¶m_map, "key") { None => return Ok("".to_owned()), - Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)), + Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)), }; let right_side: Result<&dyn ContextElement, WalkError> = Self::get_rval(breadcrumbs, ¶m_map, "value") .unwrap_or(Err(WalkError::CantWalk)) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); match (left_side, right_side) { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( @@ -596,7 +596,7 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperLessThanOrEquals(parameterized_block) => { - let new_breadcrumbs = Self::new_breadcrumbs_partial( + let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, None, @@ -607,12 +607,12 @@ impl<'a> DustRenderer<'a> { let left_side: Result<&dyn ContextElement, WalkError> = match Self::get_rval(breadcrumbs, ¶m_map, "key") { None => return Ok("".to_owned()), - Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)), + Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)), }; let right_side: Result<&dyn ContextElement, WalkError> = Self::get_rval(breadcrumbs, ¶m_map, "value") .unwrap_or(Err(WalkError::CantWalk)) - .map(|ice| ice.into_context_element(breadcrumbs)); + .map(|ice| ice.into_context_element(self, breadcrumbs)); match (left_side, right_side) { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( @@ -707,6 +707,7 @@ impl<'a> DustRenderer<'a> { } fn new_breadcrumbs_section<'b>( + &self, breadcrumbs: &'b Vec<&'b dyn IntoContextElement>, index_context: Option<&'b dyn IntoContextElement>, injected_context: Option<&'b dyn IntoContextElement>, @@ -731,7 +732,7 @@ impl<'a> DustRenderer<'a> { }; explicit_context.as_ref().map(|path| { walk_path(breadcrumbs, &path.keys) - .map(|ice| ice.into_context_element(breadcrumbs)) + .map(|ice| ice.into_context_element(self, breadcrumbs)) .map(|val| { if val.is_truthy() { new_stack.push(val.from_context_element()) @@ -745,6 +746,7 @@ impl<'a> DustRenderer<'a> { } fn new_breadcrumbs_partial<'b>( + &self, breadcrumbs: &'b Vec<&'b dyn IntoContextElement>, explicit_context_breadcrumbs: &'b Vec<&'b dyn IntoContextElement>, injected_context: Option<&'b dyn IntoContextElement>, @@ -778,7 +780,7 @@ impl<'a> DustRenderer<'a> { explicit_context.as_ref().map(|path| { walk_path(explicit_context_breadcrumbs, &path.keys) // TODO should resolving the value here use explicit_context_breadcrumbs or breadcrumbs? - .map(|ice| ice.into_context_element(explicit_context_breadcrumbs)) + .map(|ice| ice.into_context_element(self, explicit_context_breadcrumbs)) .map(|val| { if val.is_truthy() { new_stack.push(val.from_context_element())