Switched to returning an Option for into_context_element().

This commit is contained in:
Tom Alexander 2020-05-31 22:17:58 -04:00
parent 3aaf7f9987
commit b74dc394a8
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
3 changed files with 15 additions and 11 deletions

View File

@ -105,7 +105,7 @@ pub trait IntoContextElement: Debug + Walkable /* + CloneIntoBoxedContextElement
&self, &self,
renderer: &DustRenderer, renderer: &DustRenderer,
breadcrumbs: Option<&BreadcrumbTree>, breadcrumbs: Option<&BreadcrumbTree>,
) -> &dyn ContextElement; ) -> Option<&dyn ContextElement>;
} }
impl<C: ContextElement> IntoContextElement for C { impl<C: ContextElement> IntoContextElement for C {
@ -113,7 +113,7 @@ impl<C: ContextElement> IntoContextElement for C {
&self, &self,
renderer: &DustRenderer, renderer: &DustRenderer,
breadcrumbs: Option<&BreadcrumbTree>, breadcrumbs: Option<&BreadcrumbTree>,
) -> &dyn ContextElement { ) -> Option<&dyn ContextElement> {
self Some(self)
} }
} }

View File

@ -36,9 +36,9 @@ impl<'a> IntoContextElement for RValue<'a> {
&self, &self,
renderer: &DustRenderer, renderer: &DustRenderer,
breadcrumbs: Option<&BreadcrumbTree>, breadcrumbs: Option<&BreadcrumbTree>,
) -> &dyn ContextElement { ) -> Option<&dyn ContextElement> {
match self { match self {
RValue::RVLiteral(owned_literal) => owned_literal, RValue::RVLiteral(owned_literal) => Some(owned_literal),
RValue::RVPath(path) => todo!(), RValue::RVPath(path) => todo!(),
RValue::RVTemplate(template) => todo!(), RValue::RVTemplate(template) => todo!(),
} }

View File

@ -151,8 +151,8 @@ impl<'a> DustRenderer<'a> {
let val = walk_path(breadcrumbs, &reference.path.keys) let val = walk_path(breadcrumbs, &reference.path.keys)
.map(|ice| ice.into_context_element(self, breadcrumbs)); .map(|ice| ice.into_context_element(self, breadcrumbs));
match val { match val {
Err(WalkError::CantWalk) => return Ok("".to_owned()), Err(WalkError::CantWalk) | Ok(None) => return Ok("".to_owned()),
Ok(final_val) => { Ok(Some(final_val)) => {
return if final_val.is_truthy() { return if final_val.is_truthy() {
final_val.render(&Self::preprocess_filters(&reference.filters)) final_val.render(&Self::preprocess_filters(&reference.filters))
} else { } else {
@ -218,8 +218,10 @@ impl<'a> DustRenderer<'a> {
let mut new_nodes: Vec<BreadcrumbTreeElement> = Vec::new(); let mut new_nodes: Vec<BreadcrumbTreeElement> = Vec::new();
explicit_context.as_ref().map(|path| { explicit_context.as_ref().map(|path| {
let x = walk_path(maybe_breadcrumbs, &path.keys); walk_path(maybe_breadcrumbs, &path.keys)
x.map(|ice| ice.into_context_element(self, maybe_breadcrumbs)) .map(|ice| ice.into_context_element(self, maybe_breadcrumbs))
.ok()
.flatten()
.map(|val| { .map(|val| {
if val.is_truthy() { if val.is_truthy() {
new_nodes.push(BreadcrumbTreeElement::Borrowed(val.from_context_element())) new_nodes.push(BreadcrumbTreeElement::Borrowed(val.from_context_element()))
@ -283,11 +285,13 @@ impl<'a> DustRenderer<'a> {
} }
}); });
explicit_context.as_ref().map(|path| { explicit_context.as_ref().map(|path| {
let x = walk_path(maybe_breadcrumbs, &path.keys);
// TODO: should resolving the value here use // TODO: should resolving the value here use
// explicit_context_maybe_breadcrumbs or // explicit_context_maybe_breadcrumbs or
// maybe_breadcrumbs? // maybe_breadcrumbs?
x.map(|ice| ice.into_context_element(self, maybe_breadcrumbs)) walk_path(maybe_breadcrumbs, &path.keys)
.map(|ice| ice.into_context_element(self, maybe_breadcrumbs))
.ok()
.flatten()
.map(|val| { .map(|val| {
if val.is_truthy() { if val.is_truthy() {
new_nodes.push(BreadcrumbTreeElement::Borrowed(val.from_context_element())) new_nodes.push(BreadcrumbTreeElement::Borrowed(val.from_context_element()))