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