Add the renderer to calls to convert to a context element.
This commit is contained in:
parent
917da5a073
commit
737c98d8b7
@ -1,6 +1,7 @@
|
||||
use crate::parser::Filter;
|
||||
use crate::renderer::errors::RenderError;
|
||||
use crate::renderer::errors::WalkError;
|
||||
use crate::renderer::DustRenderer;
|
||||
use std::any::Any;
|
||||
use std::{cmp::Ordering, fmt::Debug};
|
||||
|
||||
@ -101,6 +102,7 @@ impl<C: ContextElement> FromContextElement for C {
|
||||
pub trait IntoContextElement: Debug + Walkable + CloneIntoBoxedContextElement {
|
||||
fn into_context_element(
|
||||
&self,
|
||||
renderer: &DustRenderer,
|
||||
breadcrumbs: &Vec<&dyn IntoContextElement>,
|
||||
) -> &dyn ContextElement;
|
||||
}
|
||||
@ -108,6 +110,7 @@ pub trait IntoContextElement: Debug + Walkable + CloneIntoBoxedContextElement {
|
||||
impl<C: ContextElement> IntoContextElement for C {
|
||||
fn into_context_element(
|
||||
&self,
|
||||
renderer: &DustRenderer,
|
||||
breadcrumbs: &Vec<&dyn IntoContextElement>,
|
||||
) -> &dyn ContextElement {
|
||||
self
|
||||
|
@ -4,6 +4,7 @@ use crate::renderer::context_element::CompareContextElement;
|
||||
use crate::renderer::context_element::ContextElement;
|
||||
use crate::renderer::context_element::IntoContextElement;
|
||||
use crate::renderer::walking::walk_path;
|
||||
use crate::renderer::DustRenderer;
|
||||
use crate::renderer::Loopable;
|
||||
use crate::renderer::RenderError;
|
||||
use crate::renderer::Renderable;
|
||||
@ -243,8 +244,10 @@ impl CompareContextElement for OwnedLiteral {
|
||||
impl IntoContextElement for Vec<PartialNameElement> {
|
||||
fn into_context_element(
|
||||
&self,
|
||||
renderer: &DustRenderer,
|
||||
breadcrumbs: &Vec<&dyn IntoContextElement>,
|
||||
) -> &dyn ContextElement {
|
||||
// renderer.render_partial_name(self,
|
||||
// TODO
|
||||
&OwnedLiteral::LPositiveInteger(1)
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ impl<'a> DustRenderer<'a> {
|
||||
DustTag::DTLiteralStringBlock(literal) => return Ok((*literal).to_owned()),
|
||||
DustTag::DTReference(reference) => {
|
||||
let val = walk_path(breadcrumbs, &reference.path.keys)
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
match val {
|
||||
Err(WalkError::CantWalk) => return Ok("".to_owned()),
|
||||
Ok(final_val) => {
|
||||
@ -170,10 +170,10 @@ impl<'a> DustRenderer<'a> {
|
||||
DustTag::DTSection(container) => {
|
||||
let injected_context = ParametersContext::new(breadcrumbs, &container.params);
|
||||
let val = walk_path(breadcrumbs, &container.path.keys)
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
match val {
|
||||
Err(WalkError::CantWalk) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_section(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_section(
|
||||
breadcrumbs,
|
||||
None,
|
||||
Some(&injected_context),
|
||||
@ -199,7 +199,7 @@ impl<'a> DustRenderer<'a> {
|
||||
final_val.get_loop_elements();
|
||||
if loop_elements.is_empty() {
|
||||
// Scalar value
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_section(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_section(
|
||||
breadcrumbs,
|
||||
None,
|
||||
Some(&injected_context),
|
||||
@ -221,8 +221,8 @@ impl<'a> DustRenderer<'a> {
|
||||
.map(|(i, array_elem)| {
|
||||
let index_context =
|
||||
IterationContext::new(i, total_length);
|
||||
let new_breadcrumbs =
|
||||
Self::new_breadcrumbs_section(
|
||||
let new_breadcrumbs = self
|
||||
.new_breadcrumbs_section(
|
||||
breadcrumbs,
|
||||
Some(&index_context),
|
||||
Some(&injected_context),
|
||||
@ -248,7 +248,7 @@ impl<'a> DustRenderer<'a> {
|
||||
// an empty array or null), Dust uses the
|
||||
// original context before walking the path as
|
||||
// the context for rendering the else block
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_section(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_section(
|
||||
breadcrumbs,
|
||||
None,
|
||||
Some(&injected_context),
|
||||
@ -265,14 +265,14 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
}
|
||||
DustTag::DTExists(container) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
&container.explicit_context,
|
||||
);
|
||||
let val = walk_path(breadcrumbs, &container.path.keys)
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
return if val.map(|v| v.is_truthy()).unwrap_or(false) {
|
||||
self.render_maybe_body(
|
||||
&container.contents,
|
||||
@ -288,14 +288,14 @@ impl<'a> DustRenderer<'a> {
|
||||
};
|
||||
}
|
||||
DustTag::DTNotExists(container) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
&container.explicit_context,
|
||||
);
|
||||
let val = walk_path(breadcrumbs, &container.path.keys)
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
return if !val.map(|v| v.is_truthy()).unwrap_or(false) {
|
||||
self.render_maybe_body(
|
||||
&container.contents,
|
||||
@ -313,7 +313,7 @@ impl<'a> DustRenderer<'a> {
|
||||
DustTag::DTPartial(partial) => {
|
||||
let partial_name = self.render_partial_name(&partial.name, breadcrumbs, blocks)?;
|
||||
if partial.params.is_empty() {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
@ -327,7 +327,7 @@ impl<'a> DustRenderer<'a> {
|
||||
return Ok(rendered_content);
|
||||
} else {
|
||||
let injected_context = ParametersContext::new(breadcrumbs, &partial.params);
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
Some(&injected_context),
|
||||
@ -346,7 +346,7 @@ impl<'a> DustRenderer<'a> {
|
||||
return Ok("".to_owned());
|
||||
}
|
||||
DustTag::DTBlock(named_block) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
blocks.breadcrumbs,
|
||||
None,
|
||||
@ -366,7 +366,7 @@ impl<'a> DustRenderer<'a> {
|
||||
};
|
||||
}
|
||||
DustTag::DTHelperEquals(parameterized_block) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
@ -395,12 +395,12 @@ impl<'a> DustRenderer<'a> {
|
||||
let left_side: Result<&dyn ContextElement, WalkError> =
|
||||
match Self::get_rval(breadcrumbs, ¶m_map, "key") {
|
||||
None => return Ok("".to_owned()),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)),
|
||||
};
|
||||
let right_side: Result<&dyn ContextElement, WalkError> =
|
||||
Self::get_rval(breadcrumbs, ¶m_map, "value")
|
||||
.unwrap_or(Err(WalkError::CantWalk))
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
|
||||
if left_side == right_side {
|
||||
return self.render_maybe_body(
|
||||
@ -417,7 +417,7 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
}
|
||||
DustTag::DTHelperNotEquals(parameterized_block) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
@ -446,12 +446,12 @@ impl<'a> DustRenderer<'a> {
|
||||
let left_side: Result<&dyn ContextElement, WalkError> =
|
||||
match Self::get_rval(breadcrumbs, ¶m_map, "key") {
|
||||
None => return Ok("".to_owned()),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)),
|
||||
};
|
||||
let right_side: Result<&dyn ContextElement, WalkError> =
|
||||
Self::get_rval(breadcrumbs, ¶m_map, "value")
|
||||
.unwrap_or(Err(WalkError::CantWalk))
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
if left_side != right_side {
|
||||
return self.render_maybe_body(
|
||||
¶meterized_block.contents,
|
||||
@ -467,7 +467,7 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
}
|
||||
DustTag::DTHelperGreaterThan(parameterized_block) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
@ -478,12 +478,12 @@ impl<'a> DustRenderer<'a> {
|
||||
let left_side: Result<&dyn ContextElement, WalkError> =
|
||||
match Self::get_rval(breadcrumbs, ¶m_map, "key") {
|
||||
None => return Ok("".to_owned()),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)),
|
||||
};
|
||||
let right_side: Result<&dyn ContextElement, WalkError> =
|
||||
Self::get_rval(breadcrumbs, ¶m_map, "value")
|
||||
.unwrap_or(Err(WalkError::CantWalk))
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
match (left_side, right_side) {
|
||||
(Err(_), _) | (_, Err(_)) => {
|
||||
return self.render_maybe_body(
|
||||
@ -510,7 +510,7 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
}
|
||||
DustTag::DTHelperGreaterThanOrEquals(parameterized_block) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
@ -521,12 +521,12 @@ impl<'a> DustRenderer<'a> {
|
||||
let left_side: Result<&dyn ContextElement, WalkError> =
|
||||
match Self::get_rval(breadcrumbs, ¶m_map, "key") {
|
||||
None => return Ok("".to_owned()),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)),
|
||||
};
|
||||
let right_side: Result<&dyn ContextElement, WalkError> =
|
||||
Self::get_rval(breadcrumbs, ¶m_map, "value")
|
||||
.unwrap_or(Err(WalkError::CantWalk))
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
match (left_side, right_side) {
|
||||
(Err(_), _) | (_, Err(_)) => {
|
||||
return self.render_maybe_body(
|
||||
@ -553,7 +553,7 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
}
|
||||
DustTag::DTHelperLessThan(parameterized_block) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
@ -564,12 +564,12 @@ impl<'a> DustRenderer<'a> {
|
||||
let left_side: Result<&dyn ContextElement, WalkError> =
|
||||
match Self::get_rval(breadcrumbs, ¶m_map, "key") {
|
||||
None => return Ok("".to_owned()),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)),
|
||||
};
|
||||
let right_side: Result<&dyn ContextElement, WalkError> =
|
||||
Self::get_rval(breadcrumbs, ¶m_map, "value")
|
||||
.unwrap_or(Err(WalkError::CantWalk))
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
match (left_side, right_side) {
|
||||
(Err(_), _) | (_, Err(_)) => {
|
||||
return self.render_maybe_body(
|
||||
@ -596,7 +596,7 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
}
|
||||
DustTag::DTHelperLessThanOrEquals(parameterized_block) => {
|
||||
let new_breadcrumbs = Self::new_breadcrumbs_partial(
|
||||
let new_breadcrumbs = self.new_breadcrumbs_partial(
|
||||
breadcrumbs,
|
||||
breadcrumbs,
|
||||
None,
|
||||
@ -607,12 +607,12 @@ impl<'a> DustRenderer<'a> {
|
||||
let left_side: Result<&dyn ContextElement, WalkError> =
|
||||
match Self::get_rval(breadcrumbs, ¶m_map, "key") {
|
||||
None => return Ok("".to_owned()),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(breadcrumbs)),
|
||||
Some(res) => res.map(|ice| ice.into_context_element(self, breadcrumbs)),
|
||||
};
|
||||
let right_side: Result<&dyn ContextElement, WalkError> =
|
||||
Self::get_rval(breadcrumbs, ¶m_map, "value")
|
||||
.unwrap_or(Err(WalkError::CantWalk))
|
||||
.map(|ice| ice.into_context_element(breadcrumbs));
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
||||
match (left_side, right_side) {
|
||||
(Err(_), _) | (_, Err(_)) => {
|
||||
return self.render_maybe_body(
|
||||
@ -707,6 +707,7 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
|
||||
fn new_breadcrumbs_section<'b>(
|
||||
&self,
|
||||
breadcrumbs: &'b Vec<&'b dyn IntoContextElement>,
|
||||
index_context: Option<&'b dyn IntoContextElement>,
|
||||
injected_context: Option<&'b dyn IntoContextElement>,
|
||||
@ -731,7 +732,7 @@ impl<'a> DustRenderer<'a> {
|
||||
};
|
||||
explicit_context.as_ref().map(|path| {
|
||||
walk_path(breadcrumbs, &path.keys)
|
||||
.map(|ice| ice.into_context_element(breadcrumbs))
|
||||
.map(|ice| ice.into_context_element(self, breadcrumbs))
|
||||
.map(|val| {
|
||||
if val.is_truthy() {
|
||||
new_stack.push(val.from_context_element())
|
||||
@ -745,6 +746,7 @@ impl<'a> DustRenderer<'a> {
|
||||
}
|
||||
|
||||
fn new_breadcrumbs_partial<'b>(
|
||||
&self,
|
||||
breadcrumbs: &'b Vec<&'b dyn IntoContextElement>,
|
||||
explicit_context_breadcrumbs: &'b Vec<&'b dyn IntoContextElement>,
|
||||
injected_context: Option<&'b dyn IntoContextElement>,
|
||||
@ -778,7 +780,7 @@ impl<'a> DustRenderer<'a> {
|
||||
explicit_context.as_ref().map(|path| {
|
||||
walk_path(explicit_context_breadcrumbs, &path.keys)
|
||||
// TODO should resolving the value here use explicit_context_breadcrumbs or breadcrumbs?
|
||||
.map(|ice| ice.into_context_element(explicit_context_breadcrumbs))
|
||||
.map(|ice| ice.into_context_element(self, explicit_context_breadcrumbs))
|
||||
.map(|val| {
|
||||
if val.is_truthy() {
|
||||
new_stack.push(val.from_context_element())
|
||||
|
Loading…
x
Reference in New Issue
Block a user