duster/src/renderer/breadcrumb_tree.rs
2020-06-07 13:27:57 -04:00

58 lines
1.9 KiB
Rust

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<dyn IntoContextElement + 'a>),
Borrowed(&'a dyn IntoContextElement),
}
impl<'a> BreadcrumbTreeElement<'a> {
pub fn from_owned<I: 'a + IntoContextElement>(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<IceResult<'a>> 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<dyn IntoContextElement + 'a> for BreadcrumbTreeElement<'a> {
fn borrow(&self) -> &(dyn IntoContextElement + 'a) {
match self {
BreadcrumbTreeElement::Owned(ice) => ice.as_ref(),
BreadcrumbTreeElement::Borrowed(ice) => *ice,
}
}
}