diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 86f2e98..7ae9c64 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -110,6 +110,7 @@ impl<'a> DustRenderer<'a> { Ok(output) } + /// For rendering a dynamic partial's name fn render_partial_name( &'a self, body: &'a Vec, @@ -324,6 +325,12 @@ impl<'a> DustRenderer<'a> { }; } DustTag::DTHelperEquals(parameterized_block) => { + let new_breadcrumbs = Self::new_breadcrumbs( + breadcrumbs, + None, + ¶meterized_block.explicit_context, + None, + ); let param_map: HashMap<&str, &RValue<'a>> = Self::get_rval_map(¶meterized_block.params); // Special case: when comparing two RVPaths, if the @@ -334,7 +341,11 @@ impl<'a> DustRenderer<'a> { return match ¶meterized_block.contents { None => Ok("".to_owned()), Some(body) => { - let rendered_content = self.render_body(body, breadcrumbs, blocks)?; + let rendered_content = self.render_body( + body, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + )?; Ok(rendered_content) } }; @@ -348,21 +359,28 @@ impl<'a> DustRenderer<'a> { let right_side: Result<&dyn ContextElement, WalkError> = Self::get_rval(breadcrumbs, ¶m_map, "value") .unwrap_or(Err(WalkError::CantWalk)); + if left_side == right_side { return self.render_maybe_body( ¶meterized_block.contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } else { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } } DustTag::DTHelperNotEquals(parameterized_block) => { + let new_breadcrumbs = Self::new_breadcrumbs( + breadcrumbs, + None, + ¶meterized_block.explicit_context, + None, + ); let param_map: HashMap<&str, &RValue<'a>> = Self::get_rval_map(¶meterized_block.params); // Special case: when comparing two RVPaths, if the @@ -373,7 +391,11 @@ impl<'a> DustRenderer<'a> { return match ¶meterized_block.else_contents { None => Ok("".to_owned()), Some(body) => { - let rendered_content = self.render_body(body, breadcrumbs, blocks)?; + let rendered_content = self.render_body( + body, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + )?; Ok(rendered_content) } }; @@ -390,18 +412,24 @@ impl<'a> DustRenderer<'a> { if left_side != right_side { return self.render_maybe_body( ¶meterized_block.contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } else { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } } DustTag::DTHelperGreaterThan(parameterized_block) => { + let new_breadcrumbs = Self::new_breadcrumbs( + breadcrumbs, + None, + ¶meterized_block.explicit_context, + None, + ); let param_map: HashMap<&str, &RValue<'a>> = Self::get_rval_map(¶meterized_block.params); let left_side: Result<&dyn ContextElement, WalkError> = @@ -416,7 +444,7 @@ impl<'a> DustRenderer<'a> { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ) } @@ -424,13 +452,13 @@ impl<'a> DustRenderer<'a> { if left_side_unwrapped > right_side_unwrapped { return self.render_maybe_body( ¶meterized_block.contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } else { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } @@ -438,6 +466,12 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperGreaterThanOrEquals(parameterized_block) => { + let new_breadcrumbs = Self::new_breadcrumbs( + breadcrumbs, + None, + ¶meterized_block.explicit_context, + None, + ); let param_map: HashMap<&str, &RValue<'a>> = Self::get_rval_map(¶meterized_block.params); let left_side: Result<&dyn ContextElement, WalkError> = @@ -452,7 +486,7 @@ impl<'a> DustRenderer<'a> { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ) } @@ -460,13 +494,13 @@ impl<'a> DustRenderer<'a> { if left_side_unwrapped >= right_side_unwrapped { return self.render_maybe_body( ¶meterized_block.contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } else { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } @@ -474,6 +508,12 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperLessThan(parameterized_block) => { + let new_breadcrumbs = Self::new_breadcrumbs( + breadcrumbs, + None, + ¶meterized_block.explicit_context, + None, + ); let param_map: HashMap<&str, &RValue<'a>> = Self::get_rval_map(¶meterized_block.params); let left_side: Result<&dyn ContextElement, WalkError> = @@ -488,7 +528,7 @@ impl<'a> DustRenderer<'a> { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ) } @@ -496,13 +536,13 @@ impl<'a> DustRenderer<'a> { if left_side_unwrapped < right_side_unwrapped { return self.render_maybe_body( ¶meterized_block.contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } else { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } @@ -510,6 +550,12 @@ impl<'a> DustRenderer<'a> { } } DustTag::DTHelperLessThanOrEquals(parameterized_block) => { + let new_breadcrumbs = Self::new_breadcrumbs( + breadcrumbs, + None, + ¶meterized_block.explicit_context, + None, + ); let param_map: HashMap<&str, &RValue<'a>> = Self::get_rval_map(¶meterized_block.params); let left_side: Result<&dyn ContextElement, WalkError> = @@ -524,7 +570,7 @@ impl<'a> DustRenderer<'a> { (Err(_), _) | (_, Err(_)) => { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ) } @@ -532,13 +578,13 @@ impl<'a> DustRenderer<'a> { if left_side_unwrapped <= right_side_unwrapped { return self.render_maybe_body( ¶meterized_block.contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } else { return self.render_maybe_body( ¶meterized_block.else_contents, - breadcrumbs, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, ); } @@ -629,7 +675,7 @@ impl<'a> DustRenderer<'a> { /// /// If explicit_context is not None, then the final breadcrumb stack will be: /// - /// ``` + /// ```text /// breadcrumbs /// injected_context /// new_context_element @@ -639,7 +685,7 @@ impl<'a> DustRenderer<'a> { /// breadcrumbs are omitted, leading to the new breadcrumb stack /// as: /// - /// ``` + /// ```text /// injected_context /// explicit_context /// new_context_element