From 88887bff0f3b17357a1b63b58102686cc6dfb6de Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 7 Jun 2020 19:10:25 -0400 Subject: [PATCH] Implemented early termination. --- src/renderer/renderer.rs | 62 ++++++++++++++++++++-------------- src/renderer/select_context.rs | 2 ++ 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 071b032..6929d82 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -80,7 +80,7 @@ impl<'a> DustRenderer<'a> { &main_template.contents, breadcrumbs, &new_block_context, - None, + &mut None, ) } @@ -89,7 +89,7 @@ impl<'a> DustRenderer<'a> { body: &'a Option, breadcrumbs: &'a Vec>, blocks: &'a BlockContext<'a>, - select_context: Option<&'a SelectContext<'a>>, + select_context: &mut Option>, ) -> Result { match body { None => Ok("".to_owned()), @@ -102,7 +102,7 @@ impl<'a> DustRenderer<'a> { body: &'a Body, breadcrumbs: &'a Vec>, blocks: &'a BlockContext<'a>, - select_context: Option<&'a SelectContext<'a>>, + select_context: &mut Option>, ) -> Result { let mut output = String::new(); for elem in &body.elements { @@ -138,7 +138,7 @@ impl<'a> DustRenderer<'a> { }, breadcrumbs, &empty_block_context, - None, + &mut None, ) } @@ -147,7 +147,7 @@ impl<'a> DustRenderer<'a> { tag: &'a DustTag, breadcrumbs: &'a Vec>, blocks: &'a BlockContext<'a>, - select_context: Option<&'a SelectContext<'a>>, + select_context: &mut Option>, ) -> Result { match tag { DustTag::DTComment(_comment) => (), @@ -196,7 +196,7 @@ impl<'a> DustRenderer<'a> { &container.else_contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ); } Ok(Some(final_val)) => { @@ -220,7 +220,7 @@ impl<'a> DustRenderer<'a> { body, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ) } else { // Array-like value @@ -246,7 +246,7 @@ impl<'a> DustRenderer<'a> { .as_ref() .unwrap_or(breadcrumbs), blocks, - None, + &mut None, ) }) .collect(); @@ -271,7 +271,7 @@ impl<'a> DustRenderer<'a> { &container.else_contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ) }; } @@ -292,13 +292,13 @@ impl<'a> DustRenderer<'a> { &container.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ), _ => self.render_maybe_body( &container.else_contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ), }; } @@ -317,13 +317,13 @@ impl<'a> DustRenderer<'a> { &container.else_contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ), _ => self.render_maybe_body( &container.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ), }; } @@ -375,13 +375,13 @@ impl<'a> DustRenderer<'a> { &named_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ), Some(inline_partial) => self.render_maybe_body( inline_partial, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ), }; } @@ -391,6 +391,12 @@ impl<'a> DustRenderer<'a> { | DustTag::DTHelperLessThan(parameterized_block) | DustTag::DTHelperGreaterThanOrEquals(parameterized_block) | DustTag::DTHelperLessThanOrEquals(parameterized_block) => { + match select_context { + Some(sc) if sc.allowed_to_render_any_more_conditionals == false => { + return Ok("".to_owned()) + } + _ => (), + } let new_breadcrumbs = self.new_breadcrumbs_partial( breadcrumbs, breadcrumbs, @@ -402,22 +408,25 @@ impl<'a> DustRenderer<'a> { .perform_comparison_check( tag, breadcrumbs, - select_context.map(|sc| sc.select_parameters), + select_context.as_ref().map(|sc| sc.select_parameters), ) .map(|check_result| { if check_result { + select_context.as_mut().map(|sc| { + sc.allowed_to_render_any_more_conditionals = false; + }); self.render_maybe_body( ¶meterized_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ) } else { self.render_maybe_body( ¶meterized_block.else_contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ) } }) @@ -439,7 +448,7 @@ impl<'a> DustRenderer<'a> { ¶meterized_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ) } (Ok(index_resolved), Ok(len_resolved)) => { @@ -464,7 +473,7 @@ impl<'a> DustRenderer<'a> { ¶meterized_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ); } } @@ -499,7 +508,7 @@ impl<'a> DustRenderer<'a> { ¶meterized_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ); } } @@ -542,7 +551,7 @@ impl<'a> DustRenderer<'a> { ¶meterized_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ); } } @@ -591,12 +600,13 @@ impl<'a> DustRenderer<'a> { ) }) .any(|check_result| check_result.unwrap_or(false)); - let select_context = SelectContext::new(¶m_map, are_any_checks_true); + let mut select_context = + SelectContext::new(¶m_map, are_any_checks_true); return self.render_maybe_body( ¶meterized_block.contents, new_breadcrumbs_ref, blocks, - Some(&select_context), + &mut Some(select_context), ); } } @@ -613,7 +623,7 @@ impl<'a> DustRenderer<'a> { ¶meterized_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ); } _ => return Ok("".to_owned()), @@ -630,7 +640,7 @@ impl<'a> DustRenderer<'a> { ¶meterized_block.contents, new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), blocks, - None, + &mut None, ); } _ => return Ok("".to_owned()), diff --git a/src/renderer/select_context.rs b/src/renderer/select_context.rs index 82d45a2..6e76d22 100644 --- a/src/renderer/select_context.rs +++ b/src/renderer/select_context.rs @@ -4,6 +4,7 @@ use crate::renderer::parameters_context::ParametersContext; pub struct SelectContext<'a> { pub select_parameters: &'a ParametersContext<'a>, pub were_any_true: bool, + pub allowed_to_render_any_more_conditionals: bool, } impl<'a> SelectContext<'a> { @@ -11,6 +12,7 @@ impl<'a> SelectContext<'a> { SelectContext { select_parameters: select_parameters, were_any_true: were_any_true, + allowed_to_render_any_more_conditionals: true, } } }