Skip to main content

recognizer/
recognizer.rs

1use elyze::errors::ParseResult;
2use elyze::matcher::Match;
3use elyze::recognizer::Recognizer;
4use elyze::scanner::Scanner;
5
6#[derive(Debug)]
7enum Operator {
8    Add,
9    Sub,
10}
11
12fn match_char(c: char, data: &[u8]) -> (bool, usize) {
13    match data.first() {
14        Some(&d) => (d == c as u8, 1),
15        None => (false, 0),
16    }
17}
18
19impl Match<u8> for Operator {
20    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
21        match self {
22            Operator::Add => match_char('+', data),
23            Operator::Sub => match_char('-', data),
24        }
25    }
26
27    fn size(&self) -> usize {
28        match self {
29            Operator::Add => 1,
30            Operator::Sub => 1,
31        }
32    }
33}
34
35fn main() -> ParseResult<()> {
36    let data = b"+";
37    let mut scanner = Scanner::new(data);
38    // Initialize the recognizer
39    let recognizer = Recognizer::new(&mut scanner);
40    // Try to apply the recognizer on the operator add, if it fails, return an error
41    let recognizer_add = recognizer.try_or(Operator::Add)?;
42    // Try to apply the recognizer on the operator sub, if it fails, return an error
43    let recognizer_add_and_sub = recognizer_add.try_or(Operator::Sub)?;
44    // Finish the recognizer
45    let result = recognizer_add_and_sub.finish();
46    dbg!(result);
47
48    Ok(())
49}