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());  | 
