diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index f1f7809..c3537a6 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -298,14 +298,17 @@ impl<'a> DustRenderer<'a> { return Ok(rendered_content); } else { let injected_context = ParametersContext::new(breadcrumbs, &partial.params); - // TODO: need to add a special case where the - // injected context is added 1 behind the existing - // breadcrumbs when new_context_element does not - // exist. - let mut new_breadcrumbs = breadcrumbs.clone(); - new_breadcrumbs.insert(new_breadcrumbs.len() - 1, &injected_context); - let rendered_content = - self.render_template(&partial_name, &new_breadcrumbs, Some(blocks))?; + let new_breadcrumbs = Self::new_breadcrumbs( + breadcrumbs, + Some(&injected_context), + &partial.explicit_context, + None, + ); + let rendered_content = self.render_template( + &partial_name, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + Some(blocks), + )?; return Ok(rendered_content); } } @@ -657,7 +660,18 @@ impl<'a> DustRenderer<'a> { Some(_) => Vec::with_capacity(3), None => breadcrumbs.clone(), }; - injected_context.map(|ctx| new_stack.push(ctx)); + injected_context.map(|ctx| { + // Special case: when there is no explicit context or new + // context element, the injected context gets inserted 1 + // spot behind the current context. Otherwise, the + // injected context gets added after the current context + // but before the explicit context and new context + // element. + match (explicit_context, new_context_element) { + (None, None) => new_stack.insert(std::cmp::max(new_stack.len() - 1, 0), ctx), + _ => new_stack.push(ctx), + } + }); explicit_context.as_ref().map(|path| { walk_path(breadcrumbs, &path.keys).map(|val| { if val.is_truthy() {