aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared
diff options
context:
space:
mode:
Diffstat (limited to 'askama_shared')
-rw-r--r--askama_shared/Cargo.toml6
-rw-r--r--askama_shared/src/lib.rs4
-rw-r--r--askama_shared/src/path.rs32
3 files changed, 39 insertions, 3 deletions
diff --git a/askama_shared/Cargo.toml b/askama_shared/Cargo.toml
index 8b18805..cd052cf 100644
--- a/askama_shared/Cargo.toml
+++ b/askama_shared/Cargo.toml
@@ -10,10 +10,12 @@ workspace = ".."
[features]
default = []
-serde-json = ["serde", "serde_json"]
+serde-json = ["serde_json"]
iron = []
rocket = []
[dependencies]
-serde = { version = "1.0", optional = true }
+serde = "1.0"
+serde_derive = "1.0"
serde_json = { version = "1.0", optional = true }
+toml = "0.4"
diff --git a/askama_shared/src/lib.rs b/askama_shared/src/lib.rs
index 9427dff..64d8d25 100644
--- a/askama_shared/src/lib.rs
+++ b/askama_shared/src/lib.rs
@@ -1,9 +1,11 @@
#![cfg_attr(feature = "cargo-clippy", allow(unused_parens))]
-#[cfg(feature = "serde-json")]
extern crate serde;
+#[macro_use]
+extern crate serde_derive;
#[cfg(feature = "serde-json")]
extern crate serde_json;
+extern crate toml;
pub use error::{Error, Result};
pub use escaping::MarkupDisplay;
diff --git a/askama_shared/src/path.rs b/askama_shared/src/path.rs
index 8b92250..37fb261 100644
--- a/askama_shared/src/path.rs
+++ b/askama_shared/src/path.rs
@@ -3,6 +3,8 @@ use std::fs::File;
use std::io::Read;
use std::path::{Path, PathBuf};
+use toml;
+
pub fn get_template_source(tpl_path: &Path) -> String {
let mut path = template_dir();
path.push(tpl_path);
@@ -52,6 +54,36 @@ pub fn template_dir() -> PathBuf {
path
}
+#[derive(Deserialize)]
+struct Config {
+ dirs: Option<Vec<String>>,
+}
+
+pub fn template_dirs() -> Vec<PathBuf> {
+ let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
+ let askama = root.join("askama.toml");
+ let default = vec![root.join("templates")];
+ if askama.exists() {
+ let mut contents = String::new();
+ File::open(askama).unwrap().read_to_string(&mut contents).unwrap();
+ let config: Config = toml::from_str(&contents).unwrap();
+ if let Some(dirs) = config.dirs {
+ let paths: Vec<PathBuf> = dirs.into_iter().map(|directory| {
+ root.join(directory)
+ }).collect();
+ if paths.len() > 0 {
+ paths
+ } else {
+ default
+ }
+ } else {
+ default
+ }
+ } else {
+ vec![root.join("templates")]
+ }
+}
+
#[cfg(test)]
mod tests {
use super::Path;