operators_accptor/
operators_accptor.rs1use 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#[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)?; Space::accept(scanner)?; World::accept(scanner)?; 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); 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); 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); Ok(())
123}