diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 582af12..72cda7b 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -483,8 +483,197 @@ impl<'a> DustRenderer<'a> { ); } } + DustTag::DTHelperGreaterThan(parameterized_block) => { + let new_breadcrumbs = self.new_breadcrumbs_partial( + breadcrumbs, + breadcrumbs, + None, + ¶meterized_block.explicit_context, + ); + + let param_map = + ParametersContext::new(self, breadcrumbs, ¶meterized_block.params); + let left_side = match param_map + .walk("key") + .map(|ice| ice.into_context_element(self, breadcrumbs)) + { + Err(WalkError::CantWalk) | Ok(None) => return Ok("".to_owned()), + Ok(Some(res)) => res, + }; + let right_side = param_map + .walk("value") + .map(|ice| ice.into_context_element(self, breadcrumbs)); + match (right_side) { + Ok(Some(right_side_unwrapped)) => { + if left_side.get_context_element_reference() + > right_side_unwrapped.get_context_element_reference() + { + return self.render_maybe_body( + ¶meterized_block.contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } else { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } + } + _ => { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ) + } + } + } + DustTag::DTHelperGreaterThanOrEquals(parameterized_block) => { + let new_breadcrumbs = self.new_breadcrumbs_partial( + breadcrumbs, + breadcrumbs, + None, + ¶meterized_block.explicit_context, + ); + + let param_map = + ParametersContext::new(self, breadcrumbs, ¶meterized_block.params); + let left_side = match param_map + .walk("key") + .map(|ice| ice.into_context_element(self, breadcrumbs)) + { + Err(WalkError::CantWalk) | Ok(None) => return Ok("".to_owned()), + Ok(Some(res)) => res, + }; + let right_side = param_map + .walk("value") + .map(|ice| ice.into_context_element(self, breadcrumbs)); + match (right_side) { + Ok(Some(right_side_unwrapped)) => { + if left_side.get_context_element_reference() + >= right_side_unwrapped.get_context_element_reference() + { + return self.render_maybe_body( + ¶meterized_block.contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } else { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } + } + _ => { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ) + } + } + } + DustTag::DTHelperLessThan(parameterized_block) => { + let new_breadcrumbs = self.new_breadcrumbs_partial( + breadcrumbs, + breadcrumbs, + None, + ¶meterized_block.explicit_context, + ); + + let param_map = + ParametersContext::new(self, breadcrumbs, ¶meterized_block.params); + let left_side = match param_map + .walk("key") + .map(|ice| ice.into_context_element(self, breadcrumbs)) + { + Err(WalkError::CantWalk) | Ok(None) => return Ok("".to_owned()), + Ok(Some(res)) => res, + }; + let right_side = param_map + .walk("value") + .map(|ice| ice.into_context_element(self, breadcrumbs)); + match (right_side) { + Ok(Some(right_side_unwrapped)) => { + if left_side.get_context_element_reference() + < right_side_unwrapped.get_context_element_reference() + { + return self.render_maybe_body( + ¶meterized_block.contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } else { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } + } + _ => { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ) + } + } + } + DustTag::DTHelperLessThanOrEquals(parameterized_block) => { + let new_breadcrumbs = self.new_breadcrumbs_partial( + breadcrumbs, + breadcrumbs, + None, + ¶meterized_block.explicit_context, + ); + + let param_map = + ParametersContext::new(self, breadcrumbs, ¶meterized_block.params); + let left_side = match param_map + .walk("key") + .map(|ice| ice.into_context_element(self, breadcrumbs)) + { + Err(WalkError::CantWalk) | Ok(None) => return Ok("".to_owned()), + Ok(Some(res)) => res, + }; + let right_side = param_map + .walk("value") + .map(|ice| ice.into_context_element(self, breadcrumbs)); + match (right_side) { + Ok(Some(right_side_unwrapped)) => { + if left_side.get_context_element_reference() + <= right_side_unwrapped.get_context_element_reference() + { + return self.render_maybe_body( + ¶meterized_block.contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } else { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } + } + _ => { + return self.render_maybe_body( + ¶meterized_block.else_contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ) + } + } + } _ => panic!("Unsupported tag"), } + Ok("".to_owned()) }