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 let recognizer = Recognizer::new(&mut scanner);
40 let recognizer_add = recognizer.try_or(Operator::Add)?;
42 let recognizer_add_and_sub = recognizer_add.try_or(Operator::Sub)?;
44 let result = recognizer_add_and_sub.finish();
46 dbg!(result);
47
48 Ok(())
49}