From 3f49519bea099787429de28a5deb364e1a8626e1 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 31 May 2020 15:44:09 -0400 Subject: [PATCH] Initial structure for new implementation of walking functions using the heterogeneous tree. --- src/renderer/breadcrumb_tree.rs | 4 ++-- src/renderer/mod.rs | 1 + src/renderer/tree_walking.rs | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/renderer/tree_walking.rs diff --git a/src/renderer/breadcrumb_tree.rs b/src/renderer/breadcrumb_tree.rs index 1faf0c3..3535983 100644 --- a/src/renderer/breadcrumb_tree.rs +++ b/src/renderer/breadcrumb_tree.rs @@ -7,7 +7,7 @@ pub trait BreadcrumbTree { fn get_parent(&self) -> Option<&dyn BreadcrumbTree>; } -struct BreadcrumbTreeNode<'a, C: IntoContextElement> { +pub struct BreadcrumbTreeNode<'a, C: IntoContextElement> { parent: Option<&'a dyn BreadcrumbTree>, element: BreadcrumbTreeNodeElement<'a, C>, } @@ -44,7 +44,7 @@ impl<'a, C: IntoContextElement> BreadcrumbTree for BreadcrumbTreeNode<'a, C> { } } -struct BreadcrumbTreeIterator<'a>(Option<&'a dyn BreadcrumbTree>); +pub struct BreadcrumbTreeIterator<'a>(Option<&'a dyn BreadcrumbTree>); impl<'a> Iterator for BreadcrumbTreeIterator<'a> { type Item = &'a dyn IntoContextElement; diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 3439bc5..7eecacb 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -7,6 +7,7 @@ mod inline_partial_tree; mod iteration_context; mod parameters_context; mod renderer; +mod tree_walking; mod walking; pub use context_element::CloneIntoBoxedContextElement; diff --git a/src/renderer/tree_walking.rs b/src/renderer/tree_walking.rs new file mode 100644 index 0000000..5050652 --- /dev/null +++ b/src/renderer/tree_walking.rs @@ -0,0 +1,37 @@ +use crate::renderer::breadcrumb_tree::BreadcrumbTree; +use crate::renderer::breadcrumb_tree::BreadcrumbTreeNode; +use crate::renderer::context_element::IntoContextElement; +use crate::renderer::WalkError; +use std::borrow::Borrow; + +enum WalkResult<'a> { + NoWalk, + PartialWalk, + FullyWalked(&'a dyn IntoContextElement), +} + +fn walk_path_from_single_level<'a, P, C>(context: &'a C, path: &[P]) -> WalkResult<'a> +where + P: Borrow, + C: Borrow, +{ + todo!() +} + +pub fn walk_path<'a, B, P>( + maybe_breadcrumbs: Option<&'a BreadcrumbTreeNode>, + path: &Vec

, +) -> Result<&'a dyn IntoContextElement, WalkError> +where + B: IntoContextElement, + P: Borrow, +{ + match (maybe_breadcrumbs, path.first()) { + (None, _) => return Err(WalkError::CantWalk), + (Some(breadcrumbs), None) => return Ok(breadcrumbs.get_ice()), + (Some(breadcrumbs), Some(path_first)) if path_first.borrow() == "." => (), + (Some(breadcrumbs), Some(path_first)) => (), + } + + Err(WalkError::CantWalk) +}