Merge the breadcrumb tree trait and struct into just a struct.

This commit is contained in:
Tom Alexander 2020-05-31 18:14:26 -04:00
parent 439601bbb5
commit 283430a45b
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
3 changed files with 32 additions and 51 deletions

View File

@ -1,33 +1,32 @@
use crate::renderer::context_element::IntoContextElement; use crate::renderer::context_element::IntoContextElement;
use std::borrow::Borrow; use std::borrow::Borrow;
pub trait BreadcrumbTree { pub struct BreadcrumbTree<'a> {
fn get_ice(&self) -> &dyn IntoContextElement; parent: Option<&'a BreadcrumbTree<'a>>,
element: BreadcrumbTreeElement<'a>,
fn get_parent(&self) -> Option<&dyn BreadcrumbTree>;
} }
pub struct BreadcrumbTreeNode<'a> { pub enum BreadcrumbTreeElement<'a> {
parent: Option<&'a dyn BreadcrumbTree>,
element: BreadcrumbTreeNodeElement<'a>,
}
pub enum BreadcrumbTreeNodeElement<'a> {
Owned(Box<dyn IntoContextElement>), Owned(Box<dyn IntoContextElement>),
Borrowed(&'a dyn IntoContextElement), Borrowed(&'a dyn IntoContextElement),
} }
impl<'a> BreadcrumbTreeNode<'a> { impl<'a> BreadcrumbTree<'a> {
pub fn new( pub fn new(parent: Option<&'a BreadcrumbTree>, element: BreadcrumbTreeElement<'a>) -> Self {
parent: Option<&'a dyn BreadcrumbTree>, BreadcrumbTree {
element: BreadcrumbTreeNodeElement<'a>,
) -> Self {
BreadcrumbTreeNode {
parent: parent, parent: parent,
element: element, element: element,
} }
} }
pub fn get_ice(&self) -> &dyn IntoContextElement {
self.element.borrow()
}
pub fn get_parent(&self) -> Option<&BreadcrumbTree> {
self.parent
}
pub fn ice_iter(&'a self) -> impl Iterator<Item = &dyn IntoContextElement> { pub fn ice_iter(&'a self) -> impl Iterator<Item = &dyn IntoContextElement> {
self.breadcrumb_iter().map(|b| b.get_ice()) self.breadcrumb_iter().map(|b| b.get_ice())
} }
@ -37,27 +36,17 @@ impl<'a> BreadcrumbTreeNode<'a> {
} }
} }
impl<'a> Borrow<dyn IntoContextElement + 'a> for BreadcrumbTreeNodeElement<'a> { impl<'a> Borrow<dyn IntoContextElement + 'a> for BreadcrumbTreeElement<'a> {
fn borrow(&self) -> &(dyn IntoContextElement + 'a) { fn borrow(&self) -> &(dyn IntoContextElement + 'a) {
match self { match self {
BreadcrumbTreeNodeElement::Owned(ice) => ice.as_ref(), BreadcrumbTreeElement::Owned(ice) => ice.as_ref(),
BreadcrumbTreeNodeElement::Borrowed(ice) => *ice, BreadcrumbTreeElement::Borrowed(ice) => *ice,
} }
} }
} }
impl<'a> BreadcrumbTree for BreadcrumbTreeNode<'a> { impl<'a> IntoIterator for &'a BreadcrumbTree<'a> {
fn get_ice(&self) -> &dyn IntoContextElement { type Item = &'a BreadcrumbTree<'a>;
self.element.borrow()
}
fn get_parent(&self) -> Option<&dyn BreadcrumbTree> {
self.parent
}
}
impl<'a> IntoIterator for &'a BreadcrumbTreeNode<'a> {
type Item = &'a dyn BreadcrumbTree;
type IntoIter = BreadcrumbTreeIterator<'a>; type IntoIter = BreadcrumbTreeIterator<'a>;
fn into_iter(self) -> BreadcrumbTreeIterator<'a> { fn into_iter(self) -> BreadcrumbTreeIterator<'a> {
@ -65,10 +54,10 @@ impl<'a> IntoIterator for &'a BreadcrumbTreeNode<'a> {
} }
} }
pub struct BreadcrumbTreeIterator<'a>(Option<&'a dyn BreadcrumbTree>); pub struct BreadcrumbTreeIterator<'a>(Option<&'a BreadcrumbTree<'a>>);
impl<'a> Iterator for BreadcrumbTreeIterator<'a> { impl<'a> Iterator for BreadcrumbTreeIterator<'a> {
type Item = &'a dyn BreadcrumbTree; type Item = &'a BreadcrumbTree<'a>;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
let ret = self.0; let ret = self.0;

View File

@ -2,8 +2,7 @@ use crate::parser::template;
use crate::parser::Path; use crate::parser::Path;
use crate::parser::Template; use crate::parser::Template;
use crate::renderer::breadcrumb_tree::BreadcrumbTree; use crate::renderer::breadcrumb_tree::BreadcrumbTree;
use crate::renderer::breadcrumb_tree::BreadcrumbTreeNode; use crate::renderer::breadcrumb_tree::BreadcrumbTreeElement;
use crate::renderer::breadcrumb_tree::BreadcrumbTreeNodeElement;
use crate::renderer::context_element::ContextElement; use crate::renderer::context_element::ContextElement;
use crate::renderer::context_element::IntoContextElement; use crate::renderer::context_element::IntoContextElement;
use crate::renderer::errors::CompileError; use crate::renderer::errors::CompileError;
@ -56,15 +55,12 @@ impl<'a> DustRenderer<'a> {
/// be empty) should be combined into a final BreadcrumbTreeNode /// be empty) should be combined into a final BreadcrumbTreeNode
fn new_breadcrumbs_section<'b>( fn new_breadcrumbs_section<'b>(
&self, &self,
maybe_breadcrumbs: Option<&'a BreadcrumbTreeNode>, maybe_breadcrumbs: Option<&'a BreadcrumbTree>,
index_context: Option<&'b dyn IntoContextElement>, index_context: Option<&'b dyn IntoContextElement>,
injected_context: Option<&'b dyn IntoContextElement>, injected_context: Option<&'b dyn IntoContextElement>,
explicit_context: &Option<Path<'b>>, explicit_context: &Option<Path<'b>>,
new_context_element: Option<&'b dyn ContextElement>, new_context_element: Option<&'b dyn ContextElement>,
) -> Option<( ) -> Option<(Option<&'b BreadcrumbTree>, Vec<BreadcrumbTreeElement<'b>>)> {
Option<&'b BreadcrumbTreeNode>,
Vec<BreadcrumbTreeNodeElement<'b>>,
)> {
// If none of the additional contexts are present, return None // If none of the additional contexts are present, return None
// to signal that the original breadcrumbs should be used // to signal that the original breadcrumbs should be used
// rather than incurring a copy here. // rather than incurring a copy here.
@ -95,13 +91,10 @@ impl<'a> DustRenderer<'a> {
// } // }
// }); // });
// }); // });
injected_context.map(|ctx| new_nodes.push(BreadcrumbTreeNodeElement::Borrowed(ctx))); injected_context.map(|ctx| new_nodes.push(BreadcrumbTreeElement::Borrowed(ctx)));
new_context_element.map(|ctx| { new_context_element
new_nodes.push(BreadcrumbTreeNodeElement::Borrowed( .map(|ctx| new_nodes.push(BreadcrumbTreeElement::Borrowed(ctx.from_context_element())));
ctx.from_context_element(), index_context.map(|ctx| new_nodes.push(BreadcrumbTreeElement::Borrowed(ctx)));
))
});
index_context.map(|ctx| new_nodes.push(BreadcrumbTreeNodeElement::Borrowed(ctx)));
Some((parent, new_nodes)) Some((parent, new_nodes))
} }

View File

@ -1,5 +1,4 @@
use crate::renderer::breadcrumb_tree::BreadcrumbTree; use crate::renderer::breadcrumb_tree::BreadcrumbTree;
use crate::renderer::breadcrumb_tree::BreadcrumbTreeNode;
use crate::renderer::context_element::IntoContextElement; use crate::renderer::context_element::IntoContextElement;
use crate::renderer::WalkError; use crate::renderer::WalkError;
use std::borrow::Borrow; use std::borrow::Borrow;
@ -39,8 +38,8 @@ where
} }
fn get_first_non_pseudo_element<'a>( fn get_first_non_pseudo_element<'a>(
breadcrumbs: &'a BreadcrumbTreeNode, breadcrumbs: &'a BreadcrumbTree,
) -> Option<&'a dyn BreadcrumbTree> { ) -> Option<&'a BreadcrumbTree<'a>> {
breadcrumbs breadcrumbs
.breadcrumb_iter() .breadcrumb_iter()
.filter(|b| b.get_ice().is_pseudo_element()) .filter(|b| b.get_ice().is_pseudo_element())
@ -48,7 +47,7 @@ fn get_first_non_pseudo_element<'a>(
} }
pub fn walk_path<'a, P>( pub fn walk_path<'a, P>(
maybe_breadcrumbs: Option<&'a BreadcrumbTreeNode>, maybe_breadcrumbs: Option<&'a BreadcrumbTree>,
path: &Vec<P>, path: &Vec<P>,
) -> Result<&'a dyn IntoContextElement, WalkError> ) -> Result<&'a dyn IntoContextElement, WalkError>
where where