Implemented perform_comparison_check to separate the comparison logic from the render code so that it can be used pre-rendering by the select helper.
This commit is contained in:
parent
f2740987ec
commit
85d36fc516
@ -970,12 +970,19 @@ impl<'a> DustRenderer<'a> {
|
||||
})
|
||||
}
|
||||
|
||||
/// 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>>,
|
||||
) -> bool {
|
||||
) -> Option<bool> {
|
||||
let param_map = match tag {
|
||||
DustTag::DTHelperEquals(parameterized_block)
|
||||
| DustTag::DTHelperNotEquals(parameterized_block)
|
||||
@ -985,7 +992,54 @@ impl<'a> DustRenderer<'a> {
|
||||
| DustTag::DTHelperLessThanOrEquals(parameterized_block) => ParametersContext::new(self, breadcrumbs, ¶meterized_block.params, select_parameters),
|
||||
_ => panic!("perform_comparison_check only implemented for comparison helpers (eq, ne, gt, gte, lt, lte)")
|
||||
};
|
||||
todo!()
|
||||
|
||||
let left_side = self.tap(breadcrumbs, ¶m_map, "key");
|
||||
let right_side = self.tap(breadcrumbs, ¶m_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)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user