From bcf90007d7bffa077f1f4758a68d7b31ffc1dc97 Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Wed, 19 May 2021 08:57:26 +0800 Subject: [PATCH 1/3] (fix) load partial from source when accessing partial in dev mode --- src/partial.rs | 28 ++++++++++++++++++++++++---- src/registry.rs | 27 ++++++++++++++++++++------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/partial.rs b/src/partial.rs index f89e41445..70aac129f 100644 --- a/src/partial.rs +++ b/src/partial.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::collections::HashMap; use serde_json::value::Value as Json; @@ -9,9 +10,31 @@ use crate::json::path::Path; use crate::output::Output; use crate::registry::Registry; use crate::render::{Decorator, Evaluable, RenderContext, Renderable}; +use crate::template::Template; pub(crate) const PARTIAL_BLOCK: &str = "@partial-block"; +fn find_partial<'reg: 'rc, 'rc>( + rc: &'rc mut RenderContext<'reg, 'rc>, + r: &'reg Registry<'reg>, + d: &Decorator<'reg, 'rc>, + name: &str, +) -> Result>, RenderError> { + if let Some(ref partial) = rc.get_partial(name) { + return Ok(Some(Cow::Borrowed(partial))); + } + + if let Some(tpl) = r.get_or_load_template_optional(name) { + return tpl.map(|t| Some(t)); + } + + if let Some(tpl) = d.template() { + return Ok(Some(Cow::Borrowed(tpl))); + } + + Ok(None) +} + pub fn expand_partial<'reg: 'rc, 'rc>( d: &Decorator<'reg, 'rc>, r: &'reg Registry<'reg>, @@ -30,10 +53,7 @@ pub fn expand_partial<'reg: 'rc, 'rc>( } // if tname == PARTIAL_BLOCK - let partial = rc - .get_partial(tname) - .or_else(|| r.get_template(tname)) - .or_else(|| d.template()); + let partial = find_partial(rc, r, d, tname)?; if let Some(t) = partial { // clone to avoid lifetime issue diff --git a/src/registry.rs b/src/registry.rs index 6b56af4e0..07fd9b391 100644 --- a/src/registry.rs +++ b/src/registry.rs @@ -403,19 +403,32 @@ impl<'reg> Registry<'reg> { } #[inline] - fn get_or_load_template(&'reg self, name: &str) -> Result, RenderError> { + pub(crate) fn get_or_load_template_optional( + &'reg self, + name: &str, + ) -> Option, RenderError>> { if let (true, Some(source)) = (self.dev_mode, self.template_sources.get(name)) { - source + let r = source .load() .map_err(|e| TemplateError::from((e, name.to_owned()))) .and_then(|tpl_str| Template::compile_with_name(tpl_str, name.to_owned())) .map(Cow::Owned) - .map_err(RenderError::from) + .map_err(RenderError::from); + Some(r) + } else { + self.templates.get(name).map(|t| Ok(Cow::Borrowed(t))) + } + } + + #[inline] + pub(crate) fn get_or_load_template( + &'reg self, + name: &str, + ) -> Result, RenderError> { + if let Some(result) = self.get_or_load_template_optional(name) { + result } else { - self.templates - .get(name) - .map(Cow::Borrowed) - .ok_or_else(|| RenderError::new(format!("Template not found: {}", name))) + Err(RenderError::new(format!("Template not found: {}", name))) } } From d5bb7dbadcbfe434ade6ac10bceb50a3028bf17b Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Fri, 21 May 2021 22:20:11 +0800 Subject: [PATCH 2/3] (fix) lifetime for partial resolver --- src/partial.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/partial.rs b/src/partial.rs index 70aac129f..5b140626e 100644 --- a/src/partial.rs +++ b/src/partial.rs @@ -14,12 +14,12 @@ use crate::template::Template; pub(crate) const PARTIAL_BLOCK: &str = "@partial-block"; -fn find_partial<'reg: 'rc, 'rc>( - rc: &'rc mut RenderContext<'reg, 'rc>, +fn find_partial<'reg: 'rc, 'rc: 'a, 'a>( + rc: &'a RenderContext<'reg, 'rc>, r: &'reg Registry<'reg>, d: &Decorator<'reg, 'rc>, name: &str, -) -> Result>, RenderError> { +) -> Result>, RenderError> { if let Some(ref partial) = rc.get_partial(name) { return Ok(Some(Cow::Borrowed(partial))); } From 37b9b2e448c7c3135d1acca19df915dbd874860e Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Fri, 21 May 2021 22:55:25 +0800 Subject: [PATCH 3/3] (fix) clippy warnings --- src/partial.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/partial.rs b/src/partial.rs index 5b140626e..a472d5d14 100644 --- a/src/partial.rs +++ b/src/partial.rs @@ -25,7 +25,7 @@ fn find_partial<'reg: 'rc, 'rc: 'a, 'a>( } if let Some(tpl) = r.get_or_load_template_optional(name) { - return tpl.map(|t| Some(t)); + return tpl.map(Option::Some); } if let Some(tpl) = d.template() {