diff options
| author | 2018-06-23 17:07:45 +0200 | |
|---|---|---|
| committer | 2018-06-23 17:07:45 +0200 | |
| commit | f1422f5c66509f251e1e3e2cbd1752131dd1301f (patch) | |
| tree | 3997c680a877cf474686a980e7a900953a2b9ff9 /askama_derive/src | |
| parent | 381997a9b095d656d4f3f9e1a5f483390ec52129 (diff) | |
| download | askama-f1422f5c66509f251e1e3e2cbd1752131dd1301f.tar.gz askama-f1422f5c66509f251e1e3e2cbd1752131dd1301f.tar.bz2 askama-f1422f5c66509f251e1e3e2cbd1752131dd1301f.zip | |
Add support for Index operation (see #95)
Diffstat (limited to '')
| -rw-r--r-- | askama_derive/src/generator.rs | 9 | ||||
| -rw-r--r-- | askama_derive/src/parser.rs | 17 | 
2 files changed, 25 insertions, 1 deletions
| diff --git a/askama_derive/src/generator.rs b/askama_derive/src/generator.rs index 59d8134..0e86a27 100644 --- a/askama_derive/src/generator.rs +++ b/askama_derive/src/generator.rs @@ -594,6 +594,7 @@ impl<'a> Generator<'a> {              Expr::Path(ref path) => self.visit_path(path, code),              Expr::Array(ref elements) => self.visit_array(elements, code),              Expr::Attr(ref obj, name) => self.visit_attr(obj, name, code), +            Expr::Index(ref obj, ref key) => self.visit_index(obj, key, code),              Expr::Filter(name, ref args) => self.visit_filter(name, args, code),              Expr::Unary(op, ref inner) => self.visit_unary(op, inner, code),              Expr::BinOp(op, ref left, ref right) => self.visit_binop(op, left, right, code), @@ -728,6 +729,14 @@ impl<'a> Generator<'a> {          DisplayWrap::Unwrapped      } +    fn visit_index(&mut self, obj: &Expr, key: &Expr, code: &mut String) -> DisplayWrap { +        self.visit_expr(obj, code); +        code.push_str("["); +        self.visit_expr(key, code); +        code.push_str("]"); +        DisplayWrap::Unwrapped +    } +      fn visit_method_call(          &mut self,          obj: &Expr, diff --git a/askama_derive/src/parser.rs b/askama_derive/src/parser.rs index 96e0f09..c8bbb96 100644 --- a/askama_derive/src/parser.rs +++ b/askama_derive/src/parser.rs @@ -12,6 +12,7 @@ pub enum Expr<'a> {      Path(Vec<&'a str>),      Array(Vec<Expr<'a>>),      Attr(Box<Expr<'a>>, &'a str), +    Index(Box<Expr<'a>>, Box<Expr<'a>>),      Filter(&'a str, Vec<Expr<'a>>),      Unary(&'a str, Box<Expr<'a>>),      BinOp(&'a str, Box<Expr<'a>>, Box<Expr<'a>>), @@ -347,6 +348,20 @@ named!(expr_attr<Input, Expr>, do_parse!(      })  )); +named!(expr_index<Input, Expr>, do_parse!( +    obj: expr_attr >> +    key: opt!(do_parse!( +        ws!(tag_s!("[")) >> +        key: expr_any >> +        ws!(tag_s!("]")) >> +        (key) +    )) >> +    (match key { +        Some(key) => Expr::Index(Box::new(obj), Box::new(key)), +        None => obj, +    }) +)); +  named!(filter<Input, (&str, Option<Vec<Expr>>)>, do_parse!(      tag_s!("|") >>      fname: identifier >> @@ -355,7 +370,7 @@ named!(filter<Input, (&str, Option<Vec<Expr>>)>, do_parse!(  ));  named!(expr_filtered<Input, Expr>, do_parse!( -    obj: expr_attr >> +    obj: expr_index >>      filters: many0!(filter) >>      ({         let mut res = obj; | 
