diff --git a/src/renderer/breadcrumb_tree.rs b/src/renderer/breadcrumb_tree.rs index b0a6993..ec83f4f 100644 --- a/src/renderer/breadcrumb_tree.rs +++ b/src/renderer/breadcrumb_tree.rs @@ -1,5 +1,7 @@ +use crate::renderer::context_element::ContextElement; use crate::renderer::context_element::IceResult; use crate::renderer::context_element::IntoContextElement; +use crate::renderer::context_element::IntoRcIce; use std::borrow::Borrow; use std::rc::Rc; @@ -29,6 +31,15 @@ impl<'a> From<&'a IceResult<'a>> for BreadcrumbTreeElement<'a> { } } +impl<'a> From> for BreadcrumbTreeElement<'a> { + fn from(inp: IceResult<'a>) -> Self { + match inp { + IceResult::Owned(rc_ce) => BreadcrumbTreeElement::Owned(rc_ce.into_rc_ice()), + IceResult::Borrowed(ce) => BreadcrumbTreeElement::Borrowed(ce.from_context_element()), + } + } +} + impl<'a> BreadcrumbTree<'a> { pub fn new(parent: Option<&'a BreadcrumbTree>, element: BreadcrumbTreeElement<'a>) -> Self { BreadcrumbTree { diff --git a/src/renderer/context_element.rs b/src/renderer/context_element.rs index 76def94..15b5a58 100644 --- a/src/renderer/context_element.rs +++ b/src/renderer/context_element.rs @@ -16,6 +16,7 @@ pub trait ContextElement: // + CloneIntoBoxedContextElement + CompareContextElement + FromContextElement + + IntoRcIce { } @@ -119,6 +120,16 @@ impl IntoContextElement for C { } } +pub trait IntoRcIce { + fn into_rc_ice(self: Rc) -> Rc; +} + +impl IntoRcIce for C { + fn into_rc_ice(self: Rc) -> Rc { + Rc::clone(&self) as Rc + } +} + #[derive(Clone, Debug)] pub enum IceResult<'a> { // Using Rc so that when we need to create BreadcrumbTrees with diff --git a/src/renderer/parameters_context.rs b/src/renderer/parameters_context.rs index 653443a..e614adc 100644 --- a/src/renderer/parameters_context.rs +++ b/src/renderer/parameters_context.rs @@ -3,6 +3,7 @@ use crate::parser::KVPair; use crate::parser::OwnedLiteral; use crate::parser::RValue; use crate::renderer::breadcrumb_tree::BreadcrumbTree; +use crate::renderer::breadcrumb_tree::BreadcrumbTreeElement; use crate::renderer::context_element::CompareContextElement; use crate::renderer::context_element::ContextElement; use crate::renderer::context_element::IceResult; @@ -21,7 +22,7 @@ use std::rc::Rc; #[derive(Debug)] pub struct ParametersContext<'a> { - params: HashMap<&'a str, &'a dyn IntoContextElement>, + params: HashMap<&'a str, BreadcrumbTreeElement<'a>>, } impl<'a> ParametersContext<'a> { @@ -38,12 +39,14 @@ impl<'a> ParametersContext<'a> { // then those are resolved at the time of access rather than // the time of assignment, so we leave them into their // original IntoContextElement state. - let rendered_params = params + let rendered_params: HashMap<&'a str, BreadcrumbTreeElement<'a>> = params .iter() .map(|kvpair| { let k = kvpair.key; - let v: &dyn IntoContextElement = match &kvpair.value { - RValue::RVLiteral(owned_literal) => &kvpair.value, + let v: BreadcrumbTreeElement<'a> = match &kvpair.value { + RValue::RVLiteral(owned_literal) => { + BreadcrumbTreeElement::Borrowed(&kvpair.value) + } /*RValue::RVPath(path) => kvpair .value .into_context_element(renderer, breadcrumbs) diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 7f9aec9..d0e0355 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -227,7 +227,7 @@ impl<'a> DustRenderer<'a> { .flatten() .map(|val| { if val.get_context_element_reference().is_truthy() { - new_nodes.push(BreadcrumbTreeElement::Owned(Rc::new(val))) + new_nodes.push(std::convert::From::from(val)) } }); }); @@ -297,7 +297,7 @@ impl<'a> DustRenderer<'a> { .flatten() .map(|val| { if val.get_context_element_reference().is_truthy() { - new_nodes.push(BreadcrumbTreeElement::Owned(Rc::new(val))); + new_nodes.push(std::convert::From::from(val)); } }); });