From 92dca74505b6b4e4b9bdd0abdd2139a42924105d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 31 May 2020 16:40:39 -0400 Subject: [PATCH] Running into issue where I need to know the type to create new tree node elements. --- src/renderer/breadcrumb_tree.rs | 2 +- src/renderer/tree_renderer.rs | 52 +++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/renderer/breadcrumb_tree.rs b/src/renderer/breadcrumb_tree.rs index b84eb10..0fe40e6 100644 --- a/src/renderer/breadcrumb_tree.rs +++ b/src/renderer/breadcrumb_tree.rs @@ -12,7 +12,7 @@ pub struct BreadcrumbTreeNode<'a, C: IntoContextElement> { element: BreadcrumbTreeNodeElement<'a, C>, } -enum BreadcrumbTreeNodeElement<'a, C: IntoContextElement> { +pub enum BreadcrumbTreeNodeElement<'a, C: IntoContextElement> { Owned(C), Borrowed(&'a C), } diff --git a/src/renderer/tree_renderer.rs b/src/renderer/tree_renderer.rs index 5965ffe..0f1c0a4 100644 --- a/src/renderer/tree_renderer.rs +++ b/src/renderer/tree_renderer.rs @@ -1,5 +1,11 @@ use crate::parser::template; +use crate::parser::Path; use crate::parser::Template; +use crate::renderer::breadcrumb_tree::BreadcrumbTree; +use crate::renderer::breadcrumb_tree::BreadcrumbTreeNode; +use crate::renderer::breadcrumb_tree::BreadcrumbTreeNodeElement; +use crate::renderer::context_element::ContextElement; +use crate::renderer::context_element::IntoContextElement; use crate::renderer::errors::CompileError; use std::collections::HashMap; @@ -32,4 +38,50 @@ impl<'a> DustRenderer<'a> { templates: HashMap::new(), } } + + pub fn load_source(&mut self, template: &'a CompiledTemplate) { + self.templates + .insert(template.name.clone(), &template.template); + } + + fn new_breadcrumbs_section<'b, B>( + &self, + maybe_breadcrumbs: Option<&'a BreadcrumbTreeNode>, + index_context: Option<&'b dyn IntoContextElement>, + injected_context: Option<&'b dyn IntoContextElement>, + explicit_context: &Option>, + new_context_element: Option<&'b dyn ContextElement>, + ) -> Option<&'a BreadcrumbTreeNode> + where + B: IntoContextElement, + { + // If there is no new content, return the original breadcrumbs + match ( + index_context, + injected_context, + explicit_context, + new_context_element, + ) { + (None, None, None, None) => return maybe_breadcrumbs, + _ => (), + } + + // If there is an explicit context, then drop all the current + // context + let mut new_stack = match explicit_context { + Some(_) => None, + None => maybe_breadcrumbs, + }; + + // TODO: Explicit context + injected_context.map(|ctx| { + new_stack = Some(BreadcrumbTreeNode { + parent: new_stack.map(|b| b as _), + element: BreadcrumbTreeNodeElement::Borrowed(ctx), + }); + // TODO + }); + + None + } }