bc_envelope_pattern/parse/
parse_pattern.rs

1use logos::Logos;
2
3use super::{Token, meta};
4use crate::{Error, Pattern, Result};
5
6impl Pattern {
7    /// Parse a pattern expression.
8    pub fn parse(input: impl AsRef<str>) -> Result<Pattern> {
9        let mut lexer = Token::lexer(input.as_ref());
10
11        let pattern = meta::parse_or(&mut lexer)?;
12
13        match lexer.next() {
14            None => Ok(pattern),
15            Some(Ok(_)) => Err(Error::ExtraData(lexer.span())),
16            Some(Err(e)) => {
17                // If we get an Unknown error from the lexer, convert it to
18                // UnrecognizedToken with span information
19                match e {
20                    Error::Unknown => {
21                        Err(Error::UnrecognizedToken(lexer.span()))
22                    }
23                    _ => Err(e),
24                }
25            }
26        }
27    }
28}