diff options
-rw-r--r-- | askama_parser/src/expr.rs | 12 | ||||
-rw-r--r-- | askama_parser/src/tests.rs | 83 | ||||
-rw-r--r-- | testing/tests/ui/loop_cycle_empty.rs | 3 | ||||
-rw-r--r-- | testing/tests/ui/loop_cycle_empty.stderr | 7 |
4 files changed, 93 insertions, 12 deletions
diff --git a/askama_parser/src/expr.rs b/askama_parser/src/expr.rs index ab7caff..9610c05 100644 --- a/askama_parser/src/expr.rs +++ b/askama_parser/src/expr.rs @@ -5,8 +5,8 @@ use nom::bytes::complete::{tag, take_till}; use nom::character::complete::char; use nom::combinator::{cut, map, not, opt, peek, recognize}; use nom::error::ErrorKind; -use nom::multi::{fold_many0, many0, separated_list0, separated_list1}; -use nom::sequence::{delimited, pair, preceded, terminated, tuple}; +use nom::multi::{fold_many0, many0, separated_list0}; +use nom::sequence::{pair, preceded, terminated, tuple}; use nom::{error_position, IResult}; use super::{bool_lit, char_lit, identifier, not_ws, num_lit, path, str_lit, ws}; @@ -177,10 +177,12 @@ impl<'a> Expr<'a> { } fn array(i: &'a str) -> IResult<&'a str, Self> { - delimited( + preceded( ws(char('[')), - map(separated_list1(ws(char(',')), Self::parse), Self::Array), - ws(char(']')), + cut(terminated( + map(separated_list0(char(','), ws(Self::parse)), Self::Array), + char(']'), + )), )(i) } diff --git a/askama_parser/src/tests.rs b/askama_parser/src/tests.rs index 2beeb38..61aa279 100644 --- a/askama_parser/src/tests.rs +++ b/askama_parser/src/tests.rs @@ -761,3 +761,86 @@ fn test_missing_space_after_kw() { "unable to parse template:\n\n\"{%leta=b%}\"" )); } + +#[test] +fn test_parse_array() { + let syntax = Syntax::default(); + assert_eq!( + Ast::from_str("{{ [] }}", &syntax).unwrap().nodes, + vec![Node::Expr(Ws(None, None), Expr::Array(vec![]))], + ); + assert_eq!( + Ast::from_str("{{ [1] }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Array(vec![Expr::NumLit("1")]) + )], + ); + assert_eq!( + Ast::from_str("{{ [ 1] }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Array(vec![Expr::NumLit("1")]) + )], + ); + assert_eq!( + Ast::from_str("{{ [1 ] }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Array(vec![Expr::NumLit("1")]) + )], + ); + assert_eq!( + Ast::from_str("{{ [1,2] }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Array(vec![Expr::NumLit("1"), Expr::NumLit("2")]) + )], + ); + assert_eq!( + Ast::from_str("{{ [1 ,2] }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Array(vec![Expr::NumLit("1"), Expr::NumLit("2")]) + )], + ); + assert_eq!( + Ast::from_str("{{ [1, 2] }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Array(vec![Expr::NumLit("1"), Expr::NumLit("2")]) + )], + ); + assert_eq!( + Ast::from_str("{{ [1,2 ] }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Array(vec![Expr::NumLit("1"), Expr::NumLit("2")]) + )], + ); + assert_eq!( + Ast::from_str("{{ []|foo }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Filter("foo", vec![Expr::Array(vec![])]) + )], + ); + assert_eq!( + Ast::from_str("{{ []| foo }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::Filter("foo", vec![Expr::Array(vec![])]) + )], + ); + assert_eq!( + Ast::from_str("{{ [] |foo }}", &syntax).unwrap().nodes, + vec![Node::Expr( + Ws(None, None), + Expr::BinOp( + "|", + Box::new(Expr::Array(vec![])), + Box::new(Expr::Var("foo")) + ), + )], + ); +} diff --git a/testing/tests/ui/loop_cycle_empty.rs b/testing/tests/ui/loop_cycle_empty.rs index 4aa6010..30d54fa 100644 --- a/testing/tests/ui/loop_cycle_empty.rs +++ b/testing/tests/ui/loop_cycle_empty.rs @@ -1,6 +1,3 @@ -// Nb. this test fails because currently an empty array "[]" is always a syntax error in askama, -// but even if this changes, this test should keep failing, but possibly with another error message - use askama::Template; #[derive(Template)] diff --git a/testing/tests/ui/loop_cycle_empty.stderr b/testing/tests/ui/loop_cycle_empty.stderr index 4fc35bb..dd4f0dd 100644 --- a/testing/tests/ui/loop_cycle_empty.stderr +++ b/testing/tests/ui/loop_cycle_empty.stderr @@ -1,8 +1,7 @@ -error: problems parsing template source at row 1, column 35 near: - "[]) }}{{ v }},{% endfor %}" - --> tests/ui/loop_cycle_empty.rs:6:10 +error: loop.cycle(…) cannot use an empty array + --> tests/ui/loop_cycle_empty.rs:3:10 | -6 | #[derive(Template)] +3 | #[derive(Template)] | ^^^^^^^^ | = note: this error originates in the derive macro `Template` (in Nightly builds, run with -Z macro-backtrace for more info) |