Implement IntoContextElement for ParametersContext.

This commit is contained in:
Tom Alexander 2020-06-06 20:48:29 -04:00
parent 02259b9bd6
commit 77b842f8de
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
2 changed files with 41 additions and 1 deletions

View File

@ -16,6 +16,7 @@ use crate::renderer::Renderable;
use crate::renderer::Truthiness; use crate::renderer::Truthiness;
use crate::renderer::WalkError; use crate::renderer::WalkError;
use crate::renderer::Walkable; use crate::renderer::Walkable;
use std::borrow::Borrow;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::collections::HashMap; use std::collections::HashMap;
use std::rc::Rc; use std::rc::Rc;
@ -57,6 +58,7 @@ impl<'a> ParametersContext<'a> {
}; };
v.map(|some_v| (k, some_v)) v.map(|some_v| (k, some_v))
}) })
// TODO: Should a None value here be the same as a key not existing, or should we store the Nones?
.filter_map(|pair| pair) .filter_map(|pair| pair)
.collect(); .collect();
@ -66,6 +68,29 @@ impl<'a> ParametersContext<'a> {
} }
} }
impl<'a> IntoContextElement for ParametersContext<'a> {
fn into_context_element<'b>(
&'b self,
renderer: &DustRenderer,
breadcrumbs: Option<&'b BreadcrumbTree<'b>>,
) -> Option<IceResult<'b>> {
panic!("into_context_element cannot be called on pseudo elements");
}
}
impl<'a> Walkable for ParametersContext<'a> {
fn walk(&self, segment: &str) -> Result<&dyn IntoContextElement, WalkError> {
self.params
.get(segment)
.map(|bte| bte.borrow())
.ok_or(WalkError::CantWalk)
}
fn is_pseudo_element(&self) -> bool {
true
}
}
impl<'a> IntoContextElement for RValue<'a> { impl<'a> IntoContextElement for RValue<'a> {
fn into_context_element<'b>( fn into_context_element<'b>(
&'b self, &'b self,

View File

@ -16,6 +16,7 @@ use crate::renderer::errors::RenderError;
use crate::renderer::errors::WalkError; use crate::renderer::errors::WalkError;
use crate::renderer::inline_partial_tree::extract_inline_partials; use crate::renderer::inline_partial_tree::extract_inline_partials;
use crate::renderer::inline_partial_tree::InlinePartialTreeElement; use crate::renderer::inline_partial_tree::InlinePartialTreeElement;
use crate::renderer::parameters_context::ParametersContext;
use crate::renderer::tree_walking::walk_path; use crate::renderer::tree_walking::walk_path;
use std::borrow::Borrow; use std::borrow::Borrow;
use std::collections::HashMap; use std::collections::HashMap;
@ -165,12 +166,19 @@ impl<'a> DustRenderer<'a> {
} }
} }
DustTag::DTSection(container) => { DustTag::DTSection(container) => {
//let injected_context = ParametersContext::new(breadcrumbs, &container.params); let injected_context = ParametersContext::new(self, breadcrumbs, &container.params);
let val = walk_path(breadcrumbs, &container.path.keys) let val = walk_path(breadcrumbs, &container.path.keys)
.map(|ice| ice.into_context_element(self, breadcrumbs)); .map(|ice| ice.into_context_element(self, breadcrumbs));
match val { match val {
Err(WalkError::CantWalk) => { Err(WalkError::CantWalk) => {
// TODO // TODO
let new_breadcrumbs = self.new_breadcrumbs_section(
breadcrumbs,
None,
Some(&injected_context),
&container.explicit_context,
None,
);
} }
Ok(final_val) => { Ok(final_val) => {
// TODO // TODO
@ -348,6 +356,13 @@ impl<'a> DustRenderer<'a> {
} }
final_filters final_filters
} }
fn append_new_elements_onto_tree<'b>(
original_parent: Option<&'b BreadcrumbTree>,
new_elements: Vec<BreadcrumbTreeElement<'b>>,
) -> Option<BreadcrumbTree<'b>> {
todo!()
}
} }
struct BlockContext<'a> { struct BlockContext<'a> {