From 532e252270697af2737153d27dd13f978ef856df Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 21 Jun 2018 15:47:53 +0200 Subject: Store parent field type in TemplateInput --- askama_derive/src/generator.rs | 21 ++++----------------- askama_derive/src/input.rs | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index 5d16f2c..6c6e1e7 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -61,9 +61,10 @@ impl<'a> Generator<'a> { if ctx.extends.is_none() { self.define_trait(ctx); } else { - let parent_type = get_parent_type(self.input.ast) - .expect("expected field '_parent' in extending template struct"); - self.deref_to_parent(parent_type); + match self.input.parent { + Some(ty) => self.deref_to_parent(ty), + None => panic!("expected field '_parent' in extending template struct"), + } } let trait_nodes = if ctx.extends.is_none() { @@ -930,20 +931,6 @@ where } } -fn get_parent_type(ast: &syn::DeriveInput) -> Option<&syn::Type> { - match ast.data { - syn::Data::Struct(syn::DataStruct { - fields: syn::Fields::Named(ref fields), - .. - }) => fields.named.iter().filter_map(|f| { - f.ident - .as_ref() - .and_then(|name| if name == "_parent" { Some(&f.ty) } else { None }) - }), - _ => panic!("derive(Template) only works for struct items"), - }.next() -} - #[derive(Clone, PartialEq)] enum AstLevel { Top, diff --git a/askama_derive/src/input.rs b/askama_derive/src/input.rs index d835763..afa4226 100644 --- a/askama_derive/src/input.rs +++ b/askama_derive/src/input.rs @@ -10,6 +10,7 @@ pub struct TemplateInput<'a> { pub print: Print, pub escaping: EscapeMode, pub ext: Option, + pub parent: Option<&'a syn::Type>, pub path: PathBuf, } @@ -83,6 +84,7 @@ impl<'a> TemplateInput<'a> { } _ => {} } + let escaping = match escaping { Some(m) => m, None => { @@ -101,6 +103,18 @@ impl<'a> TemplateInput<'a> { } }; + let parent = match ast.data { + syn::Data::Struct(syn::DataStruct { + fields: syn::Fields::Named(ref fields), + .. + }) => fields.named.iter().filter_map(|f| { + f.ident + .as_ref() + .and_then(|name| if name == "_parent" { Some(&f.ty) } else { None }) + }), + _ => panic!("derive(Template) only works for struct items"), + }.next(); + let path = match source { Source::Source(_) => match ext { Some(ref v) => PathBuf::from(format!("{}.{}", ast.ident, v)), @@ -115,6 +129,7 @@ impl<'a> TemplateInput<'a> { print, escaping, ext, + parent, path, } } -- cgit