diff options
author | vallentin <mail@vallentin.dev> | 2020-12-15 07:12:24 +0100 |
---|---|---|
committer | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2020-12-16 09:08:12 +0100 |
commit | 230263711e7edb0110e1679f6d31353ba7cdc919 (patch) | |
tree | 5bbbf8a3a26746c4dfbf5af9c7f28d74dcd69d85 | |
parent | 5057b75e7752f2186157fb3e1f5e5d2d0c5ff880 (diff) | |
download | askama-230263711e7edb0110e1679f6d31353ba7cdc919.tar.gz askama-230263711e7edb0110e1679f6d31353ba7cdc919.tar.bz2 askama-230263711e7edb0110e1679f6d31353ba7cdc919.zip |
Improved template loop generation (fixes #107, #333)
-rw-r--r-- | askama_shared/src/generator.rs | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/askama_shared/src/generator.rs b/askama_shared/src/generator.rs index 146f9db..0053b38 100644 --- a/askama_shared/src/generator.rs +++ b/askama_shared/src/generator.rs @@ -667,8 +667,26 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> { ", _loop_item) in ::askama::helpers::TemplateLoop::new({}) {{", expr_code )), + Expr::Array(..) => buf.writeln(&format!( + ", _loop_item) in ::askama::helpers::TemplateLoop::new({}.iter()) {{", + expr_code + )), + // If `iter` is a call then we assume it's something that returns + // an iterator. If not then the user can explicitly add the needed + // call without issues. + Expr::MethodCall(..) | Expr::PathCall(..) | Expr::Index(..) => buf.writeln(&format!( + ", _loop_item) in ::askama::helpers::TemplateLoop::new(({}).into_iter()) {{", + expr_code + )), + // If accessing `self` then it most likely needs to be + // borrowed, to prevent an attempt of moving. + _ if expr_code.starts_with("self.") => buf.writeln(&format!( + ", _loop_item) in ::askama::helpers::TemplateLoop::new(((&{}).into_iter())) {{", + expr_code + )), + // Otherwise, we borrow `iter` assuming that it implements `IntoIterator`. _ => buf.writeln(&format!( - ", _loop_item) in ::askama::helpers::TemplateLoop::new((&{}).into_iter()) {{", + ", _loop_item) in ::askama::helpers::TemplateLoop::new(({}).into_iter()) {{", expr_code )), }?; |