aboutsummaryrefslogtreecommitdiffstats
path: root/askama_parser/src/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'askama_parser/src/node.rs')
-rw-r--r--askama_parser/src/node.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/askama_parser/src/node.rs b/askama_parser/src/node.rs
index 4da1742..ba117c5 100644
--- a/askama_parser/src/node.rs
+++ b/askama_parser/src/node.rs
@@ -128,10 +128,23 @@ pub enum Target<'a> {
CharLit(&'a str),
BoolLit(&'a str),
Path(Vec<&'a str>),
+ OrChain(Vec<Target<'a>>),
}
impl<'a> Target<'a> {
+ /// Parses multiple targets with `or` separating them
pub(super) fn parse(i: &'a str) -> ParseResult<'a, Self> {
+ map(
+ separated_list1(ws(tag("or")), Self::parse_one),
+ |mut opts| match opts.len() {
+ 1 => opts.pop().unwrap(),
+ _ => Self::OrChain(opts),
+ },
+ )(i)
+ }
+
+ /// Parses a single target without an `or`, unless it is wrapped in parentheses.
+ fn parse_one(i: &'a str) -> ParseResult<'a, Self> {
let mut opt_opening_paren = map(opt(ws(char('('))), |o| o.is_some());
let mut opt_closing_paren = map(opt(ws(char(')'))), |o| o.is_some());
let mut opt_opening_brace = map(opt(ws(char('{'))), |o| o.is_some());