aboutsummaryrefslogtreecommitdiffstats
path: root/askama_derive/src/parser.rs
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2018-04-27 13:44:19 +0200
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2018-04-27 13:44:19 +0200
commit08dbe0a466cdfb3a35e19911ee364e6a0ed0f1d3 (patch)
treed5c707c0d006bfae98bf460fc0e6a41f83b21bda /askama_derive/src/parser.rs
parentb83106c8e083cb49aef92ec891387c20f0494ecd (diff)
downloadaskama-08dbe0a466cdfb3a35e19911ee364e6a0ed0f1d3.tar.gz
askama-08dbe0a466cdfb3a35e19911ee364e6a0ed0f1d3.tar.bz2
askama-08dbe0a466cdfb3a35e19911ee364e6a0ed0f1d3.zip
Add support for unary operators (fixes #83)
Diffstat (limited to '')
-rw-r--r--askama_derive/src/parser.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/askama_derive/src/parser.rs b/askama_derive/src/parser.rs
index f1e3c72..d15fc1a 100644
--- a/askama_derive/src/parser.rs
+++ b/askama_derive/src/parser.rs
@@ -13,6 +13,7 @@ pub enum Expr<'a> {
Array(Vec<Expr<'a>>),
Attr(Box<Expr<'a>>, &'a str),
Filter(&'a str, Vec<Expr<'a>>),
+ Unary(&'a str, Box<Expr<'a>>),
BinOp(&'a str, Box<Expr<'a>>, Box<Expr<'a>>),
Group(Box<Expr<'a>>),
MethodCall(Box<Expr<'a>>, &'a str, Vec<Expr<'a>>),
@@ -366,6 +367,15 @@ named!(expr_filtered<Expr>, do_parse!(
})
));
+named!(expr_unary<Expr>, do_parse!(
+ op: opt!(alt!(tag_s!("!") | tag_s!("-"))) >>
+ expr: expr_filtered >>
+ (match op {
+ Some(op) => Expr::Unary(str::from_utf8(op).unwrap(), Box::new(expr)),
+ None => expr,
+ })
+));
+
macro_rules! expr_prec_layer {
( $name:ident, $inner:ident, $( $op:expr ),* ) => {
named!($name<Expr>, do_parse!(
@@ -381,7 +391,7 @@ macro_rules! expr_prec_layer {
}
}
-expr_prec_layer!(expr_muldivmod, expr_filtered, "*", "/", "%");
+expr_prec_layer!(expr_muldivmod, expr_unary, "*", "/", "%");
expr_prec_layer!(expr_addsub, expr_muldivmod, "+", "-");
expr_prec_layer!(expr_shifts, expr_addsub, ">>", "<<");
expr_prec_layer!(expr_band, expr_shifts, "&");