Skip to main content

operators/
operators.rs

1use elyze::bytes::matchers::match_pattern;
2use elyze::errors::{ParseError, ParseResult};
3use elyze::matcher::Match;
4use elyze::recognizer::Recognizer;
5use elyze::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 is_matching(&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    fn size(&self) -> usize {
24        match self {
25            OperatorTokens::Equal => 2,
26            OperatorTokens::NotEqual => 2,
27        }
28    }
29}
30
31fn main() -> ParseResult<()> {
32    let data = b"== 2";
33    let mut scanner = Scanner::new(data);
34    let recognized = Recognizer::new(&mut scanner)
35        .try_or(OperatorTokens::NotEqual)?
36        .try_or(OperatorTokens::Equal)?
37        .finish()
38        .ok_or(ParseError::UnexpectedToken)?;
39
40    println!("{:?}", recognized); // ==
41
42    let data = b"!= 2";
43    let mut scanner = Scanner::new(data);
44    let recognized = Recognizer::new(&mut scanner)
45        .try_or(OperatorTokens::NotEqual)?
46        .try_or(OperatorTokens::Equal)?
47        .finish()
48        .ok_or(ParseError::UnexpectedToken)?;
49
50    println!("{:?}", recognized); // !=
51
52    let data = b"> 2";
53    let mut scanner = Scanner::new(data);
54    let recognized = Recognizer::new(&mut scanner)
55        .try_or(OperatorTokens::NotEqual)?
56        .try_or(OperatorTokens::Equal)?
57        .finish()
58        .ok_or(ParseError::UnexpectedToken);
59
60    println!("{:?}", recognized); // error (UnexpectedToken)
61
62    Ok(())
63}