40 lines
1.0 KiB
Rust
40 lines
1.0 KiB
Rust
![]() |
use crate::renderer::context_element::IntoContextElement;
|
||
|
use std::borrow::Borrow;
|
||
|
|
||
|
pub trait BreadcrumbTree {
|
||
|
fn get_ice(&self) -> &dyn IntoContextElement;
|
||
|
|
||
|
fn get_parent(&self) -> Option<&dyn BreadcrumbTree>;
|
||
|
}
|
||
|
|
||
|
struct BreadcrumbTreeNode<'a, C: IntoContextElement> {
|
||
|
parent: Option<&'a dyn BreadcrumbTree>,
|
||
|
element: BreadcrumbTreeNodeElement<'a, C>,
|
||
|
}
|
||
|
|
||
|
enum BreadcrumbTreeNodeElement<'a, C: IntoContextElement> {
|
||
|
Owned(C),
|
||
|
Borrowed(&'a C),
|
||
|
}
|
||
|
|
||
|
impl<'a, C: IntoContextElement> Borrow<dyn IntoContextElement + 'a>
|
||
|
for BreadcrumbTreeNodeElement<'a, C>
|
||
|
{
|
||
|
fn borrow(&self) -> &(dyn IntoContextElement + 'a) {
|
||
|
match self {
|
||
|
BreadcrumbTreeNodeElement::Owned(ice) => ice,
|
||
|
BreadcrumbTreeNodeElement::Borrowed(ice) => *ice,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<'a, C: IntoContextElement> BreadcrumbTree for BreadcrumbTreeNode<'a, C> {
|
||
|
fn get_ice(&self) -> &dyn IntoContextElement {
|
||
|
self.element.borrow()
|
||
|
}
|
||
|
|
||
|
fn get_parent(&self) -> Option<&dyn BreadcrumbTree> {
|
||
|
self.parent
|
||
|
}
|
||
|
}
|