Skip to main content

operators_accptor/
operators_accptor.rs

1use elyze::acceptor::Acceptor;
2use elyze::bytes::matchers::match_pattern;
3use elyze::errors::{ParseError, ParseResult};
4use elyze::matcher::Match;
5use elyze::scanner::Scanner;
6use elyze::visitor::Visitor;
7
8#[derive(Default, Debug)]
9struct OperatorPlus;
10#[derive(Default, Debug)]
11struct OperatorMinus;
12
13impl Match<u8> for OperatorPlus {
14    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
15        match_pattern(b"+", data)
16    }
17    fn size(&self) -> usize {
18        1
19    }
20}
21impl Match<u8> for OperatorMinus {
22    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
23        match_pattern(b"-", data)
24    }
25    fn size(&self) -> usize {
26        1
27    }
28}
29
30#[derive(Default)]
31struct Hello;
32#[derive(Default)]
33struct Space;
34#[derive(Default)]
35struct World;
36
37impl Match<u8> for Hello {
38    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
39        (&data[..5] == b"hello", 5)
40    }
41
42    fn size(&self) -> usize {
43        5
44    }
45}
46
47impl Match<u8> for Space {
48    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
49        (data[0] as char == ' ', 1)
50    }
51
52    fn size(&self) -> usize {
53        1
54    }
55}
56
57impl Match<u8> for World {
58    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
59        (&data[..5] == b"world", 5)
60    }
61
62    fn size(&self) -> usize {
63        5
64    }
65}
66
67// define a structure to implement the `Visitor` trait
68#[derive(Debug)]
69struct HelloWorld;
70
71impl<'a> Visitor<'a, u8> for HelloWorld {
72    fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
73        Hello::accept(scanner)?; // accept the word "hello"
74        Space::accept(scanner)?; // accept the space character?; // recognize the space character
75        World::accept(scanner)?; // accept the word "world"?; // recognize the word "world"
76        // return the `HelloWorld` object
77        Ok(HelloWorld)
78    }
79}
80
81#[derive(Debug)]
82enum Operator {
83    Plus(OperatorPlus),
84    Minus(OperatorMinus),
85    HelloWorld(HelloWorld),
86}
87
88fn main() -> ParseResult<()> {
89    let data = b"+ 2";
90    let mut scanner = Scanner::new(data);
91    let accepted = Acceptor::new(&mut scanner)
92        .try_or(Operator::Plus)?
93        .try_or(Operator::HelloWorld)?
94        .try_or(Operator::Minus)?
95        .finish()
96        .ok_or(ParseError::UnexpectedToken)?;
97
98    println!("{:?}", accepted); // +
99
100    let data = b"- 2";
101    let mut scanner = Scanner::new(data);
102    let accepted = Acceptor::new(&mut scanner)
103        .try_or(Operator::Plus)?
104        .try_or(Operator::HelloWorld)?
105        .try_or(Operator::Minus)?
106        .finish()
107        .ok_or(ParseError::UnexpectedToken)?;
108
109    println!("{:?}", accepted); // -
110
111    let data = b"hello world 2";
112    let mut scanner = Scanner::new(data);
113    let accepted = Acceptor::new(&mut scanner)
114        .try_or(Operator::Plus)?
115        .try_or(Operator::HelloWorld)?
116        .try_or(Operator::Minus)?
117        .finish()
118        .ok_or(ParseError::UnexpectedToken)?;
119
120    println!("{:?}", accepted); // HelloWorld
121
122    Ok(())
123}