From 303f092c3096fa21ddf03df667ede78c814ef6be Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 31 May 2020 23:47:20 -0400 Subject: [PATCH] Running into lifetime issues again. --- src/renderer/context_element.rs | 13 +++++----- src/renderer/parameters_context.rs | 38 ++++++++++++++++-------------- src/renderer/renderer.rs | 11 +++++---- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/renderer/context_element.rs b/src/renderer/context_element.rs index 7a2d7f4..76def94 100644 --- a/src/renderer/context_element.rs +++ b/src/renderer/context_element.rs @@ -106,7 +106,7 @@ pub trait IntoContextElement: Debug + Walkable /* + CloneIntoBoxedContextElement &'a self, renderer: &DustRenderer, breadcrumbs: Option<&'a BreadcrumbTree<'a>>, - ) -> Option<&'a dyn ContextElement>; + ) -> Option>; } impl IntoContextElement for C { @@ -114,8 +114,8 @@ impl IntoContextElement for C { &'a self, renderer: &DustRenderer, breadcrumbs: Option<&'a BreadcrumbTree<'a>>, - ) -> Option<&'a dyn ContextElement> { - Some(self) + ) -> Option> { + Some(IceResult::Borrowed(self)) } } @@ -143,10 +143,11 @@ impl<'a> IntoContextElement for IceResult<'a> { &'b self, renderer: &DustRenderer, breadcrumbs: Option<&'b BreadcrumbTree<'b>>, - ) -> Option<&'b dyn ContextElement> { + ) -> Option> { + // Some(*self) match self { - IceResult::Owned(rc_ce) => Some(rc_ce.as_ref()), - IceResult::Borrowed(ce) => Some(*ce), + IceResult::Owned(rc_ce) => Some(IceResult::Borrowed(rc_ce.as_ref())), + IceResult::Borrowed(ce) => Some(IceResult::Borrowed(*ce)), } } } diff --git a/src/renderer/parameters_context.rs b/src/renderer/parameters_context.rs index 20ec150..93d66ad 100644 --- a/src/renderer/parameters_context.rs +++ b/src/renderer/parameters_context.rs @@ -5,6 +5,7 @@ use crate::parser::RValue; use crate::renderer::breadcrumb_tree::BreadcrumbTree; use crate::renderer::context_element::CompareContextElement; use crate::renderer::context_element::ContextElement; +use crate::renderer::context_element::IceResult; use crate::renderer::context_element::IntoContextElement; use crate::renderer::tree_walking::walk_path; use crate::renderer::DustRenderer; @@ -37,24 +38,25 @@ impl<'a> IntoContextElement for RValue<'a> { &'b self, renderer: &DustRenderer, breadcrumbs: Option<&'b BreadcrumbTree<'b>>, - ) -> Option<&'b dyn ContextElement> { - match self { - RValue::RVLiteral(owned_literal) => Some(owned_literal), - RValue::RVPath(path) => walk_path(breadcrumbs, &path.keys) - .map(|ice| ice.into_context_element(renderer, breadcrumbs)) - .ok() - .flatten(), - RValue::RVTemplate(template) => { - // TODO - // renderer - // .render_partial_name(template, breadcrumbs) - // .map(|rendered| OwnedLiteral::LString(rendered)) - // .ok() - // .as_ref() - // .map(|l| l as _) - todo!() - } - } + ) -> Option> { + todo!() + // match self { + // RValue::RVLiteral(owned_literal) => Some(owned_literal), + // RValue::RVPath(path) => walk_path(breadcrumbs, &path.keys) + // .map(|ice| ice.into_context_element(renderer, breadcrumbs)) + // .ok() + // .flatten(), + // RValue::RVTemplate(template) => { + // // TODO + // // renderer + // // .render_partial_name(template, breadcrumbs) + // // .map(|rendered| OwnedLiteral::LString(rendered)) + // // .ok() + // // .as_ref() + // // .map(|l| l as _) + // todo!() + // } + // } } } diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index d6319ce..a779fd9 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -19,6 +19,7 @@ use crate::renderer::inline_partial_tree::InlinePartialTreeElement; use crate::renderer::tree_walking::walk_path; use std::borrow::Borrow; use std::collections::HashMap; +use std::rc::Rc; #[derive(Clone, Debug)] pub struct DustRenderer<'a> { @@ -153,8 +154,10 @@ impl<'a> DustRenderer<'a> { match val { Err(WalkError::CantWalk) | Ok(None) => return Ok("".to_owned()), Ok(Some(final_val)) => { - return if final_val.is_truthy() { - final_val.render(&Self::preprocess_filters(&reference.filters)) + return if final_val.get_context_element_reference().is_truthy() { + final_val + .get_context_element_reference() + .render(&Self::preprocess_filters(&reference.filters)) } else { Ok("".to_owned()) }; @@ -223,8 +226,8 @@ impl<'a> DustRenderer<'a> { .ok() .flatten() .map(|val| { - if val.is_truthy() { - new_nodes.push(BreadcrumbTreeElement::Borrowed(val.from_context_element())) + if val.get_context_element_reference().is_truthy() { + new_nodes.push(BreadcrumbTreeElement::Owned(Rc::new(val))) } }); });