All tests working.
This commit is contained in:
parent
865cba6f4e
commit
4e1259f1c7
@ -11,6 +11,7 @@ use crate::parser::Template;
|
||||
use crate::parser::TemplateElement;
|
||||
use crate::renderer::breadcrumb_tree::BreadcrumbTreeElement;
|
||||
use crate::renderer::context_element::ContextElement;
|
||||
use crate::renderer::context_element::IceResult;
|
||||
use crate::renderer::context_element::IntoContextElement;
|
||||
use crate::renderer::context_element::Walkable;
|
||||
use crate::renderer::errors::CompileError;
|
||||
@ -376,24 +377,6 @@ impl<'a> DustRenderer<'a> {
|
||||
let param_map =
|
||||
ParametersContext::new(self, breadcrumbs, ¶meterized_block.params);
|
||||
|
||||
// Special case: when comparing two RVPaths, if the
|
||||
// path is equal then dust assumes the values are
|
||||
// equal (otherwise, non-scalar values are
|
||||
// automatically not equal)
|
||||
if Self::are_paths_identical(¶m_map, "key", "value") {
|
||||
return match ¶meterized_block.contents {
|
||||
None => Ok("".to_owned()),
|
||||
Some(body) => {
|
||||
let rendered_content = self.render_body(
|
||||
body,
|
||||
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
||||
blocks,
|
||||
)?;
|
||||
Ok(rendered_content)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if !param_map.contains_key("key") {
|
||||
return Ok("".to_owned());
|
||||
}
|
||||
@ -403,15 +386,22 @@ impl<'a> DustRenderer<'a> {
|
||||
let right_side = param_map
|
||||
.walk("value")
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
if left_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
}) == right_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
}) {
|
||||
// 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::new_are_paths_identical(&left_side, &right_side)
|
||||
|| left_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
}) == right_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
})
|
||||
{
|
||||
return self.render_maybe_body(
|
||||
¶meterized_block.contents,
|
||||
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
||||
@ -436,24 +426,6 @@ impl<'a> DustRenderer<'a> {
|
||||
let param_map =
|
||||
ParametersContext::new(self, breadcrumbs, ¶meterized_block.params);
|
||||
|
||||
// Special case: when comparing two RVPaths, if the
|
||||
// path is equal then dust assumes the values are
|
||||
// equal (otherwise, non-scalar values are
|
||||
// automatically not equal)
|
||||
if Self::are_paths_identical(¶m_map, "key", "value") {
|
||||
return match ¶meterized_block.else_contents {
|
||||
None => Ok("".to_owned()),
|
||||
Some(body) => {
|
||||
let rendered_content = self.render_body(
|
||||
body,
|
||||
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
||||
blocks,
|
||||
)?;
|
||||
Ok(rendered_content)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if !param_map.contains_key("key") {
|
||||
return Ok("".to_owned());
|
||||
}
|
||||
@ -463,23 +435,30 @@ impl<'a> DustRenderer<'a> {
|
||||
let right_side = param_map
|
||||
.walk("value")
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
if left_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
}) != right_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
}) {
|
||||
// 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::new_are_paths_identical(&left_side, &right_side)
|
||||
|| left_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
}) == right_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
})
|
||||
{
|
||||
return self.render_maybe_body(
|
||||
¶meterized_block.contents,
|
||||
¶meterized_block.else_contents,
|
||||
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
||||
blocks,
|
||||
);
|
||||
} else {
|
||||
return self.render_maybe_body(
|
||||
¶meterized_block.else_contents,
|
||||
¶meterized_block.contents,
|
||||
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
|
||||
blocks,
|
||||
);
|
||||
@ -800,6 +779,26 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
fn new_are_paths_identical<'b>(
|
||||
left_side: &Result<Option<IceResult<'b>>, WalkError>,
|
||||
right_side: &Result<Option<IceResult<'b>>, WalkError>,
|
||||
) -> bool {
|
||||
let left_resolved = left_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
});
|
||||
let right_resolved = right_side.as_ref().map(|maybe_ice| {
|
||||
maybe_ice
|
||||
.as_ref()
|
||||
.map(|ice| ice.get_context_element_reference())
|
||||
});
|
||||
match (left_resolved, right_resolved) {
|
||||
(Ok(Some(lce)), Ok(Some(rce))) => lce as *const _ == rce as *const _,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn preprocess_filters(filters: &Vec<Filter>) -> Vec<Filter> {
|
||||
let mut final_filters: Vec<Filter> = filters
|
||||
.into_iter()
|
||||
|
Loading…
x
Reference in New Issue
Block a user