@ -20,6 +20,7 @@ use crate::renderer::inline_partial_tree::extract_inline_partials;
use crate ::renderer ::inline_partial_tree ::InlinePartialTreeElement ;
use crate ::renderer ::iteration_context ::IterationContext ;
use crate ::renderer ::parameters_context ::ParametersContext ;
use crate ::renderer ::select_context ::SelectContext ;
use crate ::renderer ::walking ::walk_path ;
use std ::borrow ::Borrow ;
use std ::collections ::HashMap ;
@ -75,7 +76,12 @@ impl<'a> DustRenderer<'a> {
breadcrumbs : breadcrumbs ,
blocks : & new_blocks ,
} ;
self . render_body ( & main_template . contents , breadcrumbs , & new_block_context )
self . render_body (
& main_template . contents ,
breadcrumbs ,
& new_block_context ,
& mut None ,
)
}
fn render_maybe_body (
@ -83,10 +89,11 @@ impl<'a> DustRenderer<'a> {
body : & ' a Option < Body > ,
breadcrumbs : & ' a Vec < BreadcrumbTreeElement < ' a > > ,
blocks : & ' a BlockContext < ' a > ,
select_context : & mut Option < SelectContext < ' a > > ,
) -> Result < String , RenderError > {
match body {
None = > Ok ( "" . to_owned ( ) ) ,
Some ( body ) = > Ok ( self . render_body ( body , breadcrumbs , blocks )? ) ,
Some ( body ) = > Ok ( self . render_body ( body , breadcrumbs , blocks , select_context )? ) ,
}
}
@ -95,6 +102,7 @@ impl<'a> DustRenderer<'a> {
body : & ' a Body ,
breadcrumbs : & ' a Vec < BreadcrumbTreeElement < ' a > > ,
blocks : & ' a BlockContext < ' a > ,
select_context : & mut Option < SelectContext < ' a > > ,
) -> Result < String , RenderError > {
let mut output = String ::new ( ) ;
for elem in & body . elements {
@ -102,7 +110,7 @@ impl<'a> DustRenderer<'a> {
TemplateElement ::TEIgnoredWhitespace ( _ ) = > { }
TemplateElement ::TESpan ( span ) = > output . push_str ( span . contents ) ,
TemplateElement ::TETag ( dt ) = > {
output . push_str ( & self . render_tag ( dt , breadcrumbs , blocks )? ) ;
output . push_str ( & self . render_tag ( dt , breadcrumbs , blocks , select_context )? ) ;
}
}
}
@ -130,6 +138,7 @@ impl<'a> DustRenderer<'a> {
} ,
breadcrumbs ,
& empty_block_context ,
& mut None ,
)
}
@ -138,6 +147,7 @@ impl<'a> DustRenderer<'a> {
tag : & ' a DustTag ,
breadcrumbs : & ' a Vec < BreadcrumbTreeElement < ' a > > ,
blocks : & ' a BlockContext < ' a > ,
select_context : & mut Option < SelectContext < ' a > > ,
) -> Result < String , RenderError > {
match tag {
DustTag ::DTComment ( _comment ) = > ( ) ,
@ -169,7 +179,8 @@ impl<'a> DustRenderer<'a> {
}
}
DustTag ::DTSection ( container ) = > {
let injected_context = ParametersContext ::new ( self , breadcrumbs , & container . params ) ;
let injected_context =
ParametersContext ::new ( self , breadcrumbs , & container . params , None ) ;
let val = walk_path ( breadcrumbs , & container . path . keys )
. map ( | ice | ice . into_context_element ( self , breadcrumbs ) ) ;
match val {
@ -185,6 +196,7 @@ impl<'a> DustRenderer<'a> {
& container . else_contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ;
}
Ok ( Some ( final_val ) ) = > {
@ -208,6 +220,7 @@ impl<'a> DustRenderer<'a> {
body ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
)
} else {
// Array-like value
@ -233,6 +246,7 @@ impl<'a> DustRenderer<'a> {
. as_ref ( )
. unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
)
} )
. collect ( ) ;
@ -257,6 +271,7 @@ impl<'a> DustRenderer<'a> {
& container . else_contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
)
} ;
}
@ -277,11 +292,13 @@ impl<'a> DustRenderer<'a> {
& container . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ,
_ = > self . render_maybe_body (
& container . else_contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ,
} ;
}
@ -300,11 +317,13 @@ impl<'a> DustRenderer<'a> {
& container . else_contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ,
_ = > self . render_maybe_body (
& container . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ,
} ;
}
@ -325,7 +344,7 @@ impl<'a> DustRenderer<'a> {
return Ok ( rendered_content ) ;
} else {
let injected_context =
ParametersContext ::new ( self , breadcrumbs , & partial . params );
ParametersContext ::new ( self , breadcrumbs , & partial . params , None );
let new_breadcrumbs = self . new_breadcrumbs_partial (
breadcrumbs ,
breadcrumbs ,
@ -356,15 +375,28 @@ impl<'a> DustRenderer<'a> {
& named_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ,
Some ( inline_partial ) = > self . render_maybe_body (
inline_partial ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ,
} ;
}
DustTag ::DTHelperEquals ( parameterized_block ) = > {
DustTag ::DTHelperEquals ( parameterized_block )
| DustTag ::DTHelperNotEquals ( parameterized_block )
| DustTag ::DTHelperGreaterThan ( parameterized_block )
| 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 ,
@ -372,265 +404,33 @@ impl<'a> DustRenderer<'a> {
& parameterized_block . explicit_context ,
) ;
let param_map =
ParametersContext ::new ( self , breadcrumbs , & parameterized_block . params ) ;
let left_side = self . tap ( breadcrumbs , & param_map , "key" ) ;
let right_side = self . tap ( breadcrumbs , & param_map , "value" ) ;
let left_side_ce = left_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
let right_side_ce = right_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
return match ( left_side_ce , right_side_ce ) {
// If "key" is not present at all, return a blank string
( None , _ ) = > Ok ( "" . to_owned ( ) ) ,
( Some ( _maybe_left_ce ) , _ ) = > {
// Special case: when comparing two RVPaths, if the
// path points to the same value then they are
// equal. This is particularly important for objects
// which compare memory locations rather than contents
// (javascript object equality).
if Self ::are_paths_identical ( & left_side_ce , & right_side_ce )
| | left_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) )
= = right_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) )
{
return self
. perform_comparison_check (
tag ,
breadcrumbs ,
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 (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
)
} else {
self . render_maybe_body (
& parameterized_block . else_contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
)
}
}
} ;
}
DustTag ::DTHelperNotEquals ( parameterized_block ) = > {
let new_breadcrumbs = self . new_breadcrumbs_partial (
breadcrumbs ,
breadcrumbs ,
None ,
& parameterized_block . explicit_context ,
) ;
let param_map =
ParametersContext ::new ( self , breadcrumbs , & parameterized_block . params ) ;
let left_side = self . tap ( breadcrumbs , & param_map , "key" ) ;
let right_side = self . tap ( breadcrumbs , & param_map , "value" ) ;
let left_side_ce = left_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
let right_side_ce = right_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
return match ( left_side_ce , right_side_ce ) {
// If "key" is not present at all, return a blank string
( None , _ ) = > Ok ( "" . to_owned ( ) ) ,
( Some ( _maybe_left_ce ) , _ ) = > {
// Special case: when comparing two RVPaths, if the
// path points to the same value then they are
// equal. This is particularly important for objects
// which compare memory locations rather than contents
// (javascript object equality).
if Self ::are_paths_identical ( & left_side_ce , & right_side_ce )
| | left_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) )
= = right_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) )
{
self . render_maybe_body (
& parameterized_block . else_contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
)
} else {
self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
)
}
}
} ;
}
DustTag ::DTHelperGreaterThan ( parameterized_block ) = > {
let new_breadcrumbs = self . new_breadcrumbs_partial (
breadcrumbs ,
breadcrumbs ,
None ,
& parameterized_block . explicit_context ,
) ;
let param_map =
ParametersContext ::new ( self , breadcrumbs , & parameterized_block . params ) ;
let left_side = self . tap ( breadcrumbs , & param_map , "key" ) ;
let right_side = self . tap ( breadcrumbs , & param_map , "value" ) ;
let left_side_ce = left_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
let right_side_ce = right_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
return match ( left_side_ce , right_side_ce ) {
// If "key" is not present at all, return a blank string
( None , _ ) = > Ok ( "" . to_owned ( ) ) ,
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value > right_value = > {
self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
)
}
_ = > self . render_maybe_body (
& parameterized_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 ,
& parameterized_block . explicit_context ,
) ;
let param_map =
ParametersContext ::new ( self , breadcrumbs , & parameterized_block . params ) ;
let left_side = self . tap ( breadcrumbs , & param_map , "key" ) ;
let right_side = self . tap ( breadcrumbs , & param_map , "value" ) ;
let left_side_ce = left_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
let right_side_ce = right_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
return match ( left_side_ce , right_side_ce ) {
// If "key" is not present at all, return a blank string
( None , _ ) = > Ok ( "" . to_owned ( ) ) ,
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value > = right_value = > {
self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
)
}
_ = > self . render_maybe_body (
& parameterized_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 ,
& parameterized_block . explicit_context ,
) ;
let param_map =
ParametersContext ::new ( self , breadcrumbs , & parameterized_block . params ) ;
let left_side = self . tap ( breadcrumbs , & param_map , "key" ) ;
let right_side = self . tap ( breadcrumbs , & param_map , "value" ) ;
let left_side_ce = left_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
let right_side_ce = right_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
return match ( left_side_ce , right_side_ce ) {
// If "key" is not present at all, return a blank string
( None , _ ) = > Ok ( "" . to_owned ( ) ) ,
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value < right_value = > {
self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
)
}
_ = > self . render_maybe_body (
& parameterized_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 ,
& parameterized_block . explicit_context ,
) ;
let param_map =
ParametersContext ::new ( self , breadcrumbs , & parameterized_block . params ) ;
let left_side = self . tap ( breadcrumbs , & param_map , "key" ) ;
let right_side = self . tap ( breadcrumbs , & param_map , "value" ) ;
let left_side_ce = left_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
let right_side_ce = right_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
return match ( left_side_ce , right_side_ce ) {
// If "key" is not present at all, return a blank string
( None , _ ) = > Ok ( "" . to_owned ( ) ) ,
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value < = right_value = > {
self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
)
}
_ = > self . render_maybe_body (
& parameterized_block . else_contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
) ,
} ;
} )
. unwrap_or ( Ok ( "" . to_owned ( ) ) ) ;
}
DustTag ::DTHelperSep ( parameterized_block ) = > {
let new_breadcrumbs = self . new_breadcrumbs_partial (
@ -648,6 +448,7 @@ impl<'a> DustRenderer<'a> {
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
)
}
( Ok ( index_resolved ) , Ok ( len_resolved ) ) = > {
@ -672,6 +473,7 @@ impl<'a> DustRenderer<'a> {
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ;
}
}
@ -706,6 +508,7 @@ impl<'a> DustRenderer<'a> {
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ;
}
}
@ -748,6 +551,7 @@ impl<'a> DustRenderer<'a> {
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ;
}
}
@ -756,6 +560,90 @@ impl<'a> DustRenderer<'a> {
}
}
}
DustTag ::DTHelperSelect ( parameterized_block ) = > {
let new_breadcrumbs = self . new_breadcrumbs_partial (
breadcrumbs ,
breadcrumbs ,
None ,
& parameterized_block . explicit_context ,
) ;
let new_breadcrumbs_ref = new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ;
match & parameterized_block . contents {
None = > return Ok ( "" . to_owned ( ) ) ,
Some ( body ) = > {
let param_map = ParametersContext ::new (
self ,
breadcrumbs ,
& parameterized_block . params ,
None ,
) ;
let are_any_checks_true = body
. elements
. iter ( )
. filter_map ( | te | match te {
TemplateElement ::TETag ( dt ) = > match dt {
DustTag ::DTHelperEquals ( _ )
| DustTag ::DTHelperNotEquals ( _ )
| DustTag ::DTHelperGreaterThan ( _ )
| DustTag ::DTHelperLessThan ( _ )
| DustTag ::DTHelperGreaterThanOrEquals ( _ )
| DustTag ::DTHelperLessThanOrEquals ( _ ) = > Some ( dt ) ,
_ = > None ,
} ,
_ = > None ,
} )
. map ( | dt | {
self . perform_comparison_check (
dt ,
new_breadcrumbs_ref ,
Some ( & param_map ) ,
)
} )
. any ( | check_result | check_result . unwrap_or ( false ) ) ;
let select_context = SelectContext ::new ( & param_map , are_any_checks_true ) ;
return self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs_ref ,
blocks ,
& mut Some ( select_context ) ,
) ;
}
}
}
DustTag ::DTHelperAny ( parameterized_block ) = > match select_context {
Some ( sc ) if sc . were_any_true = > {
let new_breadcrumbs = self . new_breadcrumbs_partial (
breadcrumbs ,
breadcrumbs ,
None ,
& parameterized_block . explicit_context ,
) ;
return self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ;
}
_ = > return Ok ( "" . to_owned ( ) ) ,
} ,
DustTag ::DTHelperNone ( parameterized_block ) = > match select_context {
Some ( sc ) if ! sc . were_any_true = > {
let new_breadcrumbs = self . new_breadcrumbs_partial (
breadcrumbs ,
breadcrumbs ,
None ,
& parameterized_block . explicit_context ,
) ;
return self . render_maybe_body (
& parameterized_block . contents ,
new_breadcrumbs . as_ref ( ) . unwrap_or ( breadcrumbs ) ,
blocks ,
& mut None ,
) ;
}
_ = > return Ok ( "" . to_owned ( ) ) ,
} ,
}
Ok ( "" . to_owned ( ) )
@ -941,6 +829,78 @@ impl<'a> DustRenderer<'a> {
! std ::borrow ::Borrow ::< dyn IntoContextElement + ' b > ::borrow ( b ) . is_pseudo_element ( )
} )
}
/// Performs a comparison (eq, ne, gt, gte, lt, lte) and returns
/// whether or not the comparison was true.
///
/// Returns None in the special case that the "key" parameter did
/// not exist at all. This means that key was not in the original
/// dust template source, which is not the same as key referencing
/// a value which does not exist.
fn perform_comparison_check (
& ' a self ,
tag : & ' a DustTag ,
breadcrumbs : & ' a Vec < BreadcrumbTreeElement < ' a > > ,
select_parameters : Option < & ' a ParametersContext < ' a > > ,
) -> Option < bool > {
let param_map = match tag {
DustTag ::DTHelperEquals ( parameterized_block )
| DustTag ::DTHelperNotEquals ( parameterized_block )
| DustTag ::DTHelperGreaterThan ( parameterized_block )
| DustTag ::DTHelperLessThan ( parameterized_block )
| DustTag ::DTHelperGreaterThanOrEquals ( parameterized_block )
| DustTag ::DTHelperLessThanOrEquals ( parameterized_block ) = > ParametersContext ::new ( self , breadcrumbs , & parameterized_block . params , select_parameters ) ,
_ = > panic! ( "perform_comparison_check only implemented for comparison helpers (eq, ne, gt, gte, lt, lte)" )
} ;
let left_side = self . tap ( breadcrumbs , & param_map , "key" ) ;
let right_side = self . tap ( breadcrumbs , & param_map , "value" ) ;
let left_side_ce = left_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
let right_side_ce = right_side . as_ref ( ) . map ( | maybe_ice | {
maybe_ice
. as_ref ( )
. map ( | ice | ice . get_context_element_reference ( ) )
} ) ;
if left_side_ce . is_none ( ) {
// If key did not exist at all, return None
return None ;
}
match tag {
// Special case: when comparing two RVPaths, if the path
// points to the same value then they are equal. This is
// particularly important for objects which compare memory
// locations rather than contents (javascript object
// equality).
DustTag ::DTHelperEquals ( _ ) = > Some ( Self ::are_paths_identical ( & left_side_ce , & right_side_ce )
| | left_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) )
= = right_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) ) ) ,
DustTag ::DTHelperNotEquals ( _ ) = > Some ( ! Self ::are_paths_identical ( & left_side_ce , & right_side_ce )
& & left_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) )
! = right_side_ce . unwrap_or ( Err ( & WalkError ::CantWalk ) ) ) ,
DustTag ::DTHelperGreaterThan ( _ ) = > Some ( match ( left_side_ce , right_side_ce ) {
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value > right_value = > true ,
_ = > false
} ) ,
DustTag ::DTHelperLessThan ( _ ) = > Some ( match ( left_side_ce , right_side_ce ) {
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value < right_value = > true ,
_ = > false
} ) ,
DustTag ::DTHelperGreaterThanOrEquals ( _ ) = > Some ( match ( left_side_ce , right_side_ce ) {
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value > = right_value = > true ,
_ = > false
} ) ,
DustTag ::DTHelperLessThanOrEquals ( _ ) = > Some ( match ( left_side_ce , right_side_ce ) {
( Some ( Ok ( left_value ) ) , Some ( Ok ( right_value ) ) ) if left_value < = right_value = > true ,
_ = > false
} ) ,
_ = > panic! ( "perform_comparison_check only implemented for comparison helpers (eq, ne, gt, gte, lt, lte)" )
}
}
}
struct BlockContext < ' a > {