summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Korber <p.korber@1aim.com>2018-11-20 18:04:37 +0100
committerPhilipp Korber <p.korber@1aim.com>2018-11-20 18:04:37 +0100
commit2006329d826bf6d424a2703f1d7d7d2187e96e96 (patch)
tree9e557f1823811720d62af1b83fc8445164802a05
parent5a743c9ef17347ecf7c00e518a844b8c25f4e90e (diff)
feat(loading) default base_dir to the path the template file was in
-rw-r--r--src/lib.rs20
-rw-r--r--src/serde_impl.rs9
2 files changed, 21 insertions, 8 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 058933d..1d0ad83 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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)? };