operators/
operators.rs

1use noa_parser::bytes::matchers::match_pattern;
2use noa_parser::errors::{ParseError, ParseResult};
3use noa_parser::matcher::{Match, MatchSize};
4use noa_parser::recognizer::Recognizer;
5use noa_parser::scanner::Scanner;
6
7enum OperatorTokens {
8    /// The `==` operator.
9    Equal,
10    /// The `!=` operator.
11    NotEqual,
12}
13
14impl Match<u8> for OperatorTokens {
15    fn matcher(&self, data: &[u8]) -> (bool, usize) {
16        match self {
17            OperatorTokens::Equal => match_pattern(b"==", data),
18            OperatorTokens::NotEqual => match_pattern(b"!=", data),
19        }
20    }
21}
22
23impl MatchSize for OperatorTokens {
24    fn size(&self) -> usize {
25        match self {
26            OperatorTokens::Equal => 2,
27            OperatorTokens::NotEqual => 2,
28        }
29    }
30}
31
32fn main() -> ParseResult<()> {
33    let data = b"== 2";
34    let mut scanner = Scanner::new(data);
35    let recognized = Recognizer::new(&mut scanner)
36        .try_or(OperatorTokens::NotEqual)?
37        .try_or(OperatorTokens::Equal)?
38        .finish()
39        .ok_or(ParseError::UnexpectedToken)?;
40
41    println!("{}", String::from_utf8_lossy(recognized)); // ==
42
43    let data = b"!= 2";
44    let mut scanner = Scanner::new(data);
45    let recognized = Recognizer::new(&mut scanner)
46        .try_or(OperatorTokens::NotEqual)?
47        .try_or(OperatorTokens::Equal)?
48        .finish()
49        .ok_or(ParseError::UnexpectedToken)?;
50
51    println!("{}", String::from_utf8_lossy(recognized)); // !=
52
53    let data = b"> 2";
54    let mut scanner = Scanner::new(data);
55    let recognized = Recognizer::new(&mut scanner)
56        .try_or(OperatorTokens::NotEqual)?
57        .try_or(OperatorTokens::Equal)?
58        .finish()
59        .ok_or(ParseError::UnexpectedToken);
60
61    println!("{:?}", recognized); // error (UnexpectedToken)
62
63    Ok(())
64}