Ran into issue: Can't returned owned data when its expecting a trait object.

This commit is contained in:
Tom Alexander 2020-05-30 18:28:33 -04:00
parent 737c98d8b7
commit 21b9e9282b
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
2 changed files with 17 additions and 8 deletions

View File

@ -247,9 +247,12 @@ impl IntoContextElement for Vec<PartialNameElement> {
renderer: &DustRenderer, renderer: &DustRenderer,
breadcrumbs: &Vec<&dyn IntoContextElement>, breadcrumbs: &Vec<&dyn IntoContextElement>,
) -> &dyn ContextElement { ) -> &dyn ContextElement {
// renderer.render_partial_name(self, OwnedLiteral::LString(
// TODO renderer
&OwnedLiteral::LPositiveInteger(1) .render_partial_name(self, breadcrumbs)
.expect("TODO: Make into_context_element return a RenderError"),
)
// &OwnedLiteral::LPositiveInteger(1)
} }
} }

View File

@ -116,21 +116,27 @@ impl<'a> DustRenderer<'a> {
Ok(output) Ok(output)
} }
/// For rendering a dynamic partial's name /// For rendering a dynamic partial's name or an rvalue template
fn render_partial_name( pub fn render_partial_name(
&'a self, &'a self,
body: &'a Vec<PartialNameElement>, body: &'a Vec<PartialNameElement>,
breadcrumbs: &Vec<&'a dyn IntoContextElement>, breadcrumbs: &Vec<&'a dyn IntoContextElement>,
blocks: &'a BlockContext<'a>,
) -> Result<String, RenderError> { ) -> Result<String, RenderError> {
let converted_to_template_elements: Vec<TemplateElement<'a>> = let converted_to_template_elements: Vec<TemplateElement<'a>> =
body.into_iter().map(|e| e.into()).collect(); body.into_iter().map(|e| e.into()).collect();
// Simple templates like partial names and reference rvalues
// cannot contain blocks or inline partials, so we use a blank
// BlockContext.
let empty_block_context = BlockContext {
breadcrumbs: &Vec::new(),
blocks: &InlinePartialTreeElement::new(None, HashMap::new()),
};
self.render_body( self.render_body(
&Body { &Body {
elements: converted_to_template_elements, elements: converted_to_template_elements,
}, },
breadcrumbs, breadcrumbs,
blocks, &empty_block_context,
) )
} }
@ -311,7 +317,7 @@ impl<'a> DustRenderer<'a> {
}; };
} }
DustTag::DTPartial(partial) => { DustTag::DTPartial(partial) => {
let partial_name = self.render_partial_name(&partial.name, breadcrumbs, blocks)?; let partial_name = self.render_partial_name(&partial.name, breadcrumbs)?;
if partial.params.is_empty() { if partial.params.is_empty() {
let new_breadcrumbs = self.new_breadcrumbs_partial( let new_breadcrumbs = self.new_breadcrumbs_partial(
breadcrumbs, breadcrumbs,