use crate::renderer::context_element::IceResult; use crate::renderer::context_element::IntoContextElement; use std::borrow::Borrow; use std::rc::Rc; #[derive(Clone, Debug)] pub enum BreadcrumbTreeElement<'a> { // Using Rc so that when we need to create BreadcrumbTrees with // the same BreadcrumbTreeElement but a different parent (for // example, when inserting behind the tail), we don't need to the // copy the already owned/malloc'd data. Owned(Rc), Borrowed(&'a dyn IntoContextElement), } impl<'a> BreadcrumbTreeElement<'a> { pub fn from_owned(val: I) -> BreadcrumbTreeElement<'a> { BreadcrumbTreeElement::Owned(Rc::new(val)) } pub fn from_borrowed(val: &'a dyn IntoContextElement) -> BreadcrumbTreeElement<'a> { BreadcrumbTreeElement::Borrowed(val) } } impl<'a> From<&'a IceResult<'a>> for BreadcrumbTreeElement<'a> { fn from(inp: &'a IceResult<'a>) -> Self { match inp { IceResult::Owned(rc_ce) => { BreadcrumbTreeElement::from_borrowed(rc_ce.from_context_element()) } IceResult::Borrowed(ce) => { BreadcrumbTreeElement::from_borrowed(ce.from_context_element()) } } } } 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::from_borrowed(ce.from_context_element()) } } } } impl<'a> Borrow for BreadcrumbTreeElement<'a> { fn borrow(&self) -> &(dyn IntoContextElement + 'a) { match self { BreadcrumbTreeElement::Owned(ice) => ice.as_ref(), BreadcrumbTreeElement::Borrowed(ice) => *ice, } } }