Skip to content

Commit 759c605

Browse files
committed
Allow spaces around the |filter operator
1 parent f07c724 commit 759c605

File tree

3 files changed

+83
-13
lines changed

3 files changed

+83
-13
lines changed

rinja_parser/src/expr.rs

+4-12
Original file line numberDiff line numberDiff line change
@@ -215,18 +215,10 @@ impl<'a> Expr<'a> {
215215
tuple((|i| Self::prefix(i, level), many0(|i| filter(i, level))))(i)?;
216216

217217
let mut res = obj;
218-
for (fname, args) in filters {
219-
res = WithSpan::new(
220-
Self::Filter(Filter {
221-
name: fname,
222-
arguments: {
223-
let mut args = args.unwrap_or_default();
224-
args.insert(0, res);
225-
args
226-
},
227-
}),
228-
start,
229-
);
218+
for (name, args) in filters {
219+
let mut arguments = args.unwrap_or_default();
220+
arguments.insert(0, res);
221+
res = WithSpan::new(Self::Filter(Filter { name, arguments }), start);
230222
}
231223

232224
Ok((i, res))

rinja_parser/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,7 @@ impl Level {
730730
#[allow(clippy::type_complexity)]
731731
fn filter(i: &str, level: Level) -> ParseResult<'_, (&str, Option<Vec<WithSpan<'_, Expr<'_>>>>)> {
732732
let (i, (_, fname, args)) = tuple((
733-
char('|'),
733+
ws(char('|')),
734734
ws(identifier),
735735
opt(|i| Expr::arguments(i, level, false)),
736736
))(i)?;

rinja_parser/src/tests.rs

+78
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,19 @@ fn test_odd_calls() {
684684
})),
685685
)]
686686
);
687+
assert_eq!(
688+
Ast::from_str("{{ a(b) |c }}", None, &syntax).unwrap().nodes,
689+
vec![Node::Expr(
690+
Ws(None, None),
691+
WithSpan::no_span(Expr::Filter(Filter {
692+
name: "c",
693+
arguments: vec![WithSpan::no_span(Expr::Call(
694+
Box::new(WithSpan::no_span(Expr::Var("a"))),
695+
vec![WithSpan::no_span(Expr::Var("b"))]
696+
))]
697+
})),
698+
)]
699+
);
687700
}
688701

689702
#[test]
@@ -833,6 +846,18 @@ fn test_parse_tuple() {
833846
})),
834847
)],
835848
);
849+
assert_eq!(
850+
Ast::from_str("{{ () | abs }}", None, &syntax)
851+
.unwrap()
852+
.nodes,
853+
vec![Node::Expr(
854+
Ws(None, None),
855+
WithSpan::no_span(Expr::Filter(Filter {
856+
name: "abs",
857+
arguments: vec![WithSpan::no_span(Expr::Tuple(vec![]))]
858+
})),
859+
)],
860+
);
836861
assert_eq!(
837862
Ast::from_str("{{ (1)|abs }}", None, &syntax).unwrap().nodes,
838863
vec![Node::Expr(
@@ -845,6 +870,20 @@ fn test_parse_tuple() {
845870
})),
846871
)],
847872
);
873+
assert_eq!(
874+
Ast::from_str("{{ (1) | abs }}", None, &syntax)
875+
.unwrap()
876+
.nodes,
877+
vec![Node::Expr(
878+
Ws(None, None),
879+
WithSpan::no_span(Expr::Filter(Filter {
880+
name: "abs",
881+
arguments: vec![WithSpan::no_span(Expr::Group(Box::new(WithSpan::no_span(
882+
Expr::NumLit("1")
883+
))))]
884+
})),
885+
)],
886+
);
848887
assert_eq!(
849888
Ast::from_str("{{ (1,)|abs }}", None, &syntax)
850889
.unwrap()
@@ -859,6 +898,20 @@ fn test_parse_tuple() {
859898
})),
860899
)],
861900
);
901+
assert_eq!(
902+
Ast::from_str("{{ (1,) | abs }}", None, &syntax)
903+
.unwrap()
904+
.nodes,
905+
vec![Node::Expr(
906+
Ws(None, None),
907+
WithSpan::no_span(Expr::Filter(Filter {
908+
name: "abs",
909+
arguments: vec![WithSpan::no_span(Expr::Tuple(vec![WithSpan::no_span(
910+
Expr::NumLit("1")
911+
)]))]
912+
})),
913+
)],
914+
);
862915
assert_eq!(
863916
Ast::from_str("{{ (1, 2)|abs }}", None, &syntax)
864917
.unwrap()
@@ -874,6 +927,21 @@ fn test_parse_tuple() {
874927
})),
875928
)],
876929
);
930+
assert_eq!(
931+
Ast::from_str("{{ (1, 2) | abs }}", None, &syntax)
932+
.unwrap()
933+
.nodes,
934+
vec![Node::Expr(
935+
Ws(None, None),
936+
WithSpan::no_span(Expr::Filter(Filter {
937+
name: "abs",
938+
arguments: vec![WithSpan::no_span(Expr::Tuple(vec![
939+
WithSpan::no_span(Expr::NumLit("1")),
940+
WithSpan::no_span(Expr::NumLit("2"))
941+
]))]
942+
})),
943+
)],
944+
);
877945
}
878946

879947
#[test]
@@ -977,6 +1045,16 @@ fn test_parse_array() {
9771045
}))
9781046
)],
9791047
);
1048+
assert_eq!(
1049+
Ast::from_str("{{ [] |foo }}", None, &syntax).unwrap().nodes,
1050+
vec![Node::Expr(
1051+
Ws(None, None),
1052+
WithSpan::no_span(Expr::Filter(Filter {
1053+
name: "foo",
1054+
arguments: vec![WithSpan::no_span(Expr::Array(vec![]))]
1055+
}))
1056+
)],
1057+
);
9801058
}
9811059

9821060
#[test]

0 commit comments

Comments
 (0)