|
|
|
@ -365,7 +365,12 @@ impl<'a> DustRenderer<'a> {
|
|
|
|
|
),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
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) => {
|
|
|
|
|
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
|
|
|
|
breadcrumbs,
|
|
|
|
|
breadcrumbs,
|
|
|
|
@ -373,35 +378,10 @@ impl<'a> DustRenderer<'a> {
|
|
|
|
|
¶meterized_block.explicit_context,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let param_map =
|
|
|
|
|
ParametersContext::new(self, breadcrumbs, ¶meterized_block.params, None);
|
|
|
|
|
|
|
|
|
|
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())
|
|
|
|
|
});
|
|
|
|
|
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, None)
|
|
|
|
|
.map(|check_result| {
|
|
|
|
|
if check_result {
|
|
|
|
|
self.render_maybe_body(
|
|
|
|
|
¶meterized_block.contents,
|
|
|
|
|
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
|
|
|
@ -414,224 +394,8 @@ impl<'a> DustRenderer<'a> {
|
|
|
|
|
blocks,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
DustTag::DTHelperNotEquals(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, None);
|
|
|
|
|
|
|
|
|
|
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())
|
|
|
|
|
});
|
|
|
|
|
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(
|
|
|
|
|
¶meterized_block.else_contents,
|
|
|
|
|
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
|
|
|
|
blocks,
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
self.render_maybe_body(
|
|
|
|
|
¶meterized_block.contents,
|
|
|
|
|
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
|
|
|
|
blocks,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
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, None);
|
|
|
|
|
|
|
|
|
|
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())
|
|
|
|
|
});
|
|
|
|
|
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(
|
|
|
|
|
¶meterized_block.contents,
|
|
|
|
|
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
|
|
|
|
blocks,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
_ => 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, None);
|
|
|
|
|
|
|
|
|
|
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())
|
|
|
|
|
});
|
|
|
|
|
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(
|
|
|
|
|
¶meterized_block.contents,
|
|
|
|
|
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
|
|
|
|
blocks,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
_ => 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, None);
|
|
|
|
|
|
|
|
|
|
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())
|
|
|
|
|
});
|
|
|
|
|
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(
|
|
|
|
|
¶meterized_block.contents,
|
|
|
|
|
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
|
|
|
|
blocks,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
_ => 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, None);
|
|
|
|
|
|
|
|
|
|
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())
|
|
|
|
|
});
|
|
|
|
|
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(
|
|
|
|
|
¶meterized_block.contents,
|
|
|
|
|
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
|
|
|
|
blocks,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
_ => self.render_maybe_body(
|
|
|
|
|
¶meterized_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(
|
|
|
|
|