Skip to content

Commit

Permalink
Add support for array literals (fixes #59)
Browse files Browse the repository at this point in the history
  • Loading branch information
djc committed Oct 20, 2017
1 parent 3d9048a commit 4af73a8
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
13 changes: 13 additions & 0 deletions askama_shared/src/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,7 @@ impl<'a> Generator<'a> {
Expr::StrLit(s) => self.visit_str_lit(s),
Expr::Var(s) => self.visit_var(s),
Expr::Path(ref path) => self.visit_path(path),
Expr::Array(ref elements) => self.visit_array(elements),
Expr::Attr(ref obj, name) => self.visit_attr(obj, name),
Expr::Filter(name, ref args) => self.visit_filter(name, args),
Expr::BinOp(op, ref left, ref right) =>
Expand Down Expand Up @@ -683,6 +684,18 @@ impl<'a> Generator<'a> {
DisplayWrap::Unwrapped
}

fn visit_array(&mut self, elements: &Vec<Expr>) -> DisplayWrap {
self.write("[");
for (i, el) in elements.iter().enumerate() {
if i > 0 {
self.write(", ");
}
self.visit_expr(el);
}
self.write("]");
DisplayWrap::Unwrapped
}

fn visit_path(&mut self, path: &Vec<&str>) -> DisplayWrap {
for (i, part) in path.iter().enumerate() {
if i > 0 {
Expand Down
18 changes: 18 additions & 0 deletions askama_shared/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ pub enum Expr<'a> {
StrLit(&'a str),
Var(&'a str),
Path(Vec<&'a str>),
Array(Vec<Expr<'a>>),
Attr(Box<Expr<'a>>, &'a str),
Filter(&'a str, Vec<Expr<'a>>),
BinOp(&'a str, Box<Expr<'a>>, Box<Expr<'a>>),
Expand Down Expand Up @@ -128,6 +129,22 @@ named!(expr_num_lit<Expr>, map!(num_lit,
|s| Expr::NumLit(s)
));

named!(expr_array_lit<Expr>, do_parse!(
ws!(tag_s!("[")) >>
first: expr_any >>
rest: many0!(do_parse!(
ws!(tag_s!(",")) >>
part: expr_any >>
(part)
)) >>
ws!(tag_s!("]")) >>
({
let mut elements = vec![first];
elements.extend(rest);
Expr::Array(elements)
})
));

named!(expr_str_lit<Expr>, map!(
delimited!(char!('"'), is_not!("\""), char!('"')),
|s| Expr::StrLit(str::from_utf8(s).unwrap())
Expand Down Expand Up @@ -204,6 +221,7 @@ named!(expr_single<Expr>, alt!(
expr_num_lit |
expr_str_lit |
expr_path |
expr_array_lit |
expr_var |
expr_group
));
Expand Down
11 changes: 11 additions & 0 deletions testing/tests/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -184,3 +184,14 @@ fn test_path_compare() {
let t = PathCompareTemplate { x: Alphabet::Alpha };
assert_eq!(t.render().unwrap(), "true");
}


#[derive(Template)]
#[template(source = "{% for i in [1, 2] %}{{ i }}{% endfor %}", ext = "txt")]
struct ArrayTemplate {}

#[test]
fn test_slice_literal() {
let t = ArrayTemplate {};
assert_eq!(t.render().unwrap(), "12");
}

0 comments on commit 4af73a8

Please sign in to comment.