aboutsummaryrefslogtreecommitdiffstats
path: root/askama_shared/src/parser.rs
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-10-04 21:08:43 +0200
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2017-10-04 21:08:43 +0200
commitd497a31e059292f7b37b46c6f17b489e9f3623b0 (patch)
tree11adee043a386dd3e7436f2c5d5b0a4f32815b7f /askama_shared/src/parser.rs
parent6c7da56ddddac1b549445befff6023c1b481db85 (diff)
downloadaskama-d497a31e059292f7b37b46c6f17b489e9f3623b0.tar.gz
askama-d497a31e059292f7b37b46c6f17b489e9f3623b0.tar.bz2
askama-d497a31e059292f7b37b46c6f17b489e9f3623b0.zip
Handle path expressions (fixes #56)
Diffstat (limited to 'askama_shared/src/parser.rs')
-rw-r--r--askama_shared/src/parser.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/askama_shared/src/parser.rs b/askama_shared/src/parser.rs
index 083e96b..495b68f 100644
--- a/askama_shared/src/parser.rs
+++ b/askama_shared/src/parser.rs
@@ -6,6 +6,7 @@ pub enum Expr<'a> {
NumLit(&'a str),
StrLit(&'a str),
Var(&'a str),
+ Path(Vec<&'a str>),
Attr(Box<Expr<'a>>, &'a str),
Filter(&'a str, Vec<Expr<'a>>),
BinOp(&'a str, Box<Expr<'a>>, Box<Expr<'a>>),
@@ -136,6 +137,22 @@ named!(expr_var<Expr>, map!(identifier,
|s| Expr::Var(s))
);
+named!(expr_path<Expr>, do_parse!(
+ start: call!(identifier) >>
+ rest: many1!(do_parse!(
+ tag_s!("::") >>
+ part: identifier >>
+ (part)
+ )) >>
+ ({
+ let mut path = vec![ start ];
+ for part in rest.iter() {
+ path.push(part);
+ }
+ Expr::Path(path)
+ })
+));
+
named!(target_single<Target>, map!(identifier,
|s| Target::Name(s)
));
@@ -186,6 +203,7 @@ named!(expr_group<Expr>, map!(
named!(expr_single<Expr>, alt!(
expr_num_lit |
expr_str_lit |
+ expr_path |
expr_var |
expr_group
));