diff options
Diffstat (limited to 'askama_parser')
-rw-r--r-- | askama_parser/src/node.rs | 13 |
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()); |