aboutsummaryrefslogtreecommitdiffstats
path: root/askama_derive/src/generator.rs
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2018-06-15 21:16:01 +0200
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2018-06-15 21:16:01 +0200
commit79c187870c41f3a20ac940873730451f293f3aec (patch)
tree0d60f99b207be1aa58850d85a6ca7558a3f7a71c /askama_derive/src/generator.rs
parent4feb832b6b2a164fb5a8b0431367d211fe54a59d (diff)
downloadaskama-79c187870c41f3a20ac940873730451f293f3aec.tar.gz
askama-79c187870c41f3a20ac940873730451f293f3aec.tar.bz2
askama-79c187870c41f3a20ac940873730451f293f3aec.zip
Handle imports as part of code generation
Diffstat (limited to 'askama_derive/src/generator.rs')
-rw-r--r--askama_derive/src/generator.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs
index f7e7692..c6507d4 100644
--- a/askama_derive/src/generator.rs
+++ b/askama_derive/src/generator.rs
@@ -12,10 +12,11 @@ use std::collections::{HashMap, HashSet};
use syn;
-pub fn generate(input: &TemplateInput, nodes: &[Node], imported: &HashMap<(&str, &str), Macro>)
- -> String {
+pub fn generate(input: &TemplateInput, nodes: &[Node]) -> String {
let mut base = None;
let mut blocks = Vec::new();
+ let mut imported = Vec::new();
+ let mut parsed = Vec::new();
let mut macros = HashMap::new();
for n in nodes {
@@ -32,9 +33,15 @@ pub fn generate(input: &TemplateInput, nodes: &[Node], imported: &HashMap<(&str,
Node::Macro(name, m) => {
macros.insert((None, *name), m);
},
+ Node::Import(_, import_path, scope) => {
+ let path = path::find_template_from_path(import_path, Some(&input.path));
+ let src = path::get_template_source(&path);
+ imported.push((*scope, src));
+ }
_ => {},
}
}
+ parsed.extend(imported.iter().map(|(scope, src)| (*scope, parser::parse(&src))));
let mut check_nested = 0;
let mut nested_blocks = Vec::new();
@@ -52,8 +59,13 @@ pub fn generate(input: &TemplateInput, nodes: &[Node], imported: &HashMap<(&str,
check_nested += 1;
}
- for (&(scope, name), m) in imported {
- macros.insert((Some(scope), name), m);
+ for (scope, ast) in &parsed {
+ for n in ast {
+ match n {
+ Node::Macro(name, m) => macros.insert((Some(*scope), name), &m),
+ _ => None,
+ };
+ }
}
Generator::default().build(&State {