diff options
author | Philipp Korber <p.korber@1aim.com> | 2018-11-20 18:04:37 +0100 |
---|---|---|
committer | Philipp Korber <p.korber@1aim.com> | 2018-11-20 18:04:37 +0100 |
commit | 2006329d826bf6d424a2703f1d7d7d2187e96e96 (patch) | |
tree | 9e557f1823811720d62af1b83fc8445164802a05 | |
parent | 5a743c9ef17347ecf7c00e518a844b8c25f4e90e (diff) |
feat(loading) default base_dir to the path the template file was in
-rw-r--r-- | src/lib.rs | 20 | ||||
-rw-r--r-- | src/serde_impl.rs | 9 |
2 files changed, 21 insertions, 8 deletions
@@ -6,12 +6,14 @@ extern crate mail_core; extern crate mail_headers; extern crate vec1; extern crate toml; +#[cfg(feature="handlebars")] +extern crate handlebars as hbs; use std::{ fs, collections::HashMap, fmt::Debug, - path::{PathBuf}, + path::{Path, PathBuf}, sync::Arc }; @@ -98,10 +100,12 @@ pub fn load_toml_template_from_path<TE, C>( let ctx2 = ctx.clone(); ctx.offload_fn(move || { - let content = fs::read_to_string(path)?; + let content = fs::read_to_string(&path)?; let base: serde_impl::TemplateBase<TE> = toml::from_str(&content)?; - Ok(base) - }).and_then(move |base| base.load(engine, &ctx2)) + let base_dir = path.parent().unwrap_or_else(||Path::new(".")); + let base_dir = CwdBaseDir::from_path(base_dir)?; + Ok((base, base_dir)) + }).and_then(move |(base, base_dir)| base.load(engine, base_dir, &ctx2)) } /// Load a template as described in a toml string; @@ -118,7 +122,13 @@ pub fn load_toml_template_from_str<TE, C>( Err(err) => { return Either::B(future::err(Error::from(err))); } }; - Either::A(base.load(engine, ctx)) + let base_dir = + match CwdBaseDir::from_path(Path::new(".")) { + Ok(base_dir) => base_dir, + Err(err) => { return Either::B(future::err(Error::from(err))) } + }; + + Either::A(base.load(engine, base_dir, ctx)) } /// Compound POD for returning data needed for preparing for rendering a template. diff --git a/src/serde_impl.rs b/src/serde_impl.rs index ff13740..c377dc9 100644 --- a/src/serde_impl.rs +++ b/src/serde_impl.rs @@ -23,7 +23,7 @@ use super::{ PathRebaseable, InnerTemplate, Subject, - UnsupportedPathError + UnsupportedPathError, }; /// Type used when deserializing a template using serde. @@ -49,7 +49,8 @@ use super::{ pub struct TemplateBase<TE: TemplateEngine> { #[serde(rename="name")] template_name: String, - base_dir: CwdBaseDir, + #[serde(default)] + base_dir: Option<CwdBaseDir>, subject: LazySubject, bodies: Vec1<TE::LazyBodyTemplate>, //TODO impl. deserialize where @@ -66,7 +67,7 @@ impl<TE> TemplateBase<TE> //TODO!! make this load all embeddings/attachments and make it a future /// Couples the template base with a specific engine instance. - pub fn load(self, mut engine: TE, ctx: &impl Context) -> impl Future<Item=Template<TE>, Error=Error> { + pub fn load(self, mut engine: TE, default_base_dir: CwdBaseDir, ctx: &impl Context) -> impl Future<Item=Template<TE>, Error=Error> { let TemplateBase { template_name, base_dir, @@ -76,6 +77,8 @@ impl<TE> TemplateBase<TE> mut attachments } = self; + let base_dir = base_dir.unwrap_or(default_base_dir); + //FIXME[rust/catch block] use catch block let catch_res = (|| -> Result<_, Error> { let subject = Subject{ template_id: engine.load_subject_template(subject.template_string)? }; |