Implement the first and last helpers.

This commit is contained in:
Tom Alexander
2020-06-07 15:16:39 -04:00
parent fdecdcb53b
commit 417466d17d
5 changed files with 188 additions and 2 deletions

View File

@@ -694,8 +694,90 @@ impl<'a> DustRenderer<'a> {
}
}
}
DustTag::DTHelperFirst(parameterized_block) => {}
DustTag::DTHelperLast(parameterized_block) => {}
DustTag::DTHelperFirst(parameterized_block) => {
let new_breadcrumbs = self.new_breadcrumbs_partial(
breadcrumbs,
breadcrumbs,
None,
&parameterized_block.explicit_context,
);
let index = self.get(breadcrumbs, &vec!["$idx"]);
let len = self.get(breadcrumbs, &vec!["$len"]);
match (index, len) {
(Err(_), _) | (_, Err(_)) => return Ok("".to_owned()),
(Ok(index_resolved), Ok(len_resolved)) => {
// Iteration contexts use OwnedLiteral::LPositiveinteger
let index_cast = index_resolved
.get_context_element_reference()
.to_any()
.downcast_ref::<OwnedLiteral>();
let len_cast = len_resolved
.get_context_element_reference()
.to_any()
.downcast_ref::<OwnedLiteral>();
match (index_cast, len_cast) {
(
Some(OwnedLiteral::LPositiveInteger(index_number)),
Some(OwnedLiteral::LPositiveInteger(len_number)),
) => {
if *index_number != 0 {
return Ok("".to_owned());
} else {
return self.render_maybe_body(
&parameterized_block.contents,
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
blocks,
);
}
}
_ => return Ok("".to_owned()),
}
}
}
}
DustTag::DTHelperLast(parameterized_block) => {
let new_breadcrumbs = self.new_breadcrumbs_partial(
breadcrumbs,
breadcrumbs,
None,
&parameterized_block.explicit_context,
);
let index = self.get(breadcrumbs, &vec!["$idx"]);
let len = self.get(breadcrumbs, &vec!["$len"]);
match (index, len) {
(Err(_), _) | (_, Err(_)) => return Ok("".to_owned()),
(Ok(index_resolved), Ok(len_resolved)) => {
// Iteration contexts use OwnedLiteral::LPositiveinteger
let index_cast = index_resolved
.get_context_element_reference()
.to_any()
.downcast_ref::<OwnedLiteral>();
let len_cast = len_resolved
.get_context_element_reference()
.to_any()
.downcast_ref::<OwnedLiteral>();
match (index_cast, len_cast) {
(
Some(OwnedLiteral::LPositiveInteger(index_number)),
Some(OwnedLiteral::LPositiveInteger(len_number)),
) => {
if *index_number != len_number - 1 {
return Ok("".to_owned());
} else {
return self.render_maybe_body(
&parameterized_block.contents,
new_breadcrumbs.as_ref().unwrap_or(breadcrumbs),
blocks,
);
}
}
_ => return Ok("".to_owned()),
}
}
}
}
}
Ok("".to_owned())