diff options
author | yossyJ <28825627+yossyJ@users.noreply.github.com> | 2019-01-04 23:12:44 +0900 |
---|---|---|
committer | Dirkjan Ochtman <dirkjan@ochtman.nl> | 2019-01-04 16:58:09 +0100 |
commit | bef88f1696b828caf72695561c2270456f35894d (patch) | |
tree | fb83e8f9fe1b05a49c18c43adef96a366dc18f6e /askama_derive/src/generator.rs | |
parent | 39e08325c0e0fba75384579427d1c6f7eca8fbc9 (diff) | |
download | askama-bef88f1696b828caf72695561c2270456f35894d.tar.gz askama-bef88f1696b828caf72695561c2270456f35894d.tar.bz2 askama-bef88f1696b828caf72695561c2270456f35894d.zip |
Add support for tuple
Diffstat (limited to '')
-rw-r--r-- | askama_derive/src/generator.rs | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index 95a7d17..67ec2c2 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -468,11 +468,7 @@ impl<'a> Generator<'a> { self.write_buf_writable(buf); buf.write("for (_loop_index, "); - let targets = self.visit_target(var); - for name in &targets { - self.locals.insert(name); - buf.write(name); - } + self.visit_target(buf, var); match iter { Expr::Range(_, _, _) => buf.writeln(&format!(") in ({}).enumerate() {{", expr_code)), _ => buf.writeln(&format!(") in (&{}).into_iter().enumerate() {{", expr_code)), @@ -576,6 +572,15 @@ impl<'a> Generator<'a> { self.locals.insert(name); buf.write(name); } + Target::Tuple(ref targets) => { + buf.write("("); + for name in targets { + self.locals.insert(name); + buf.write(name); + buf.write(","); + } + buf.write(")"); + } } buf.writeln(";"); } @@ -593,6 +598,15 @@ impl<'a> Generator<'a> { } buf.write(name); } + Target::Tuple(ref targets) => { + buf.write("let ("); + for name in targets { + self.locals.insert(name); + buf.write(name); + buf.write(","); + } + buf.write(")"); + } } buf.writeln(&format!(" = {};", &expr_buf.buf)); } @@ -1024,13 +1038,21 @@ impl<'a> Generator<'a> { DisplayWrap::Unwrapped } - fn visit_target_single<'t>(&mut self, name: &'t str) -> Vec<&'t str> { - vec![name] - } - - fn visit_target<'t>(&mut self, target: &'t Target) -> Vec<&'t str> { + fn visit_target(&mut self, buf: &mut Buffer, target: &'a Target) { match *target { - Target::Name(s) => self.visit_target_single(s), + Target::Name(name) => { + self.locals.insert(name); + buf.write(name); + } + Target::Tuple(ref targets) => { + buf.write("("); + for name in targets { + self.locals.insert(name); + buf.write(name); + buf.write(","); + } + buf.write(")"); + } } } |