diff options
Diffstat (limited to '')
| -rw-r--r-- | askama_shared/src/generator.rs | 13 | ||||
| -rw-r--r-- | askama_shared/src/parser.rs | 18 | 
2 files changed, 31 insertions, 0 deletions
| diff --git a/askama_shared/src/generator.rs b/askama_shared/src/generator.rs index f58d1dd..dcdea32 100644 --- a/askama_shared/src/generator.rs +++ b/askama_shared/src/generator.rs @@ -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) => @@ -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 { diff --git a/askama_shared/src/parser.rs b/askama_shared/src/parser.rs index 7cd8936..accefd2 100644 --- a/askama_shared/src/parser.rs +++ b/askama_shared/src/parser.rs @@ -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>>), @@ -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()) @@ -204,6 +221,7 @@ named!(expr_single<Expr>, alt!(      expr_num_lit |      expr_str_lit |      expr_path | +    expr_array_lit |      expr_var |      expr_group  )); | 
