operators_accptor_reusable/
operators_accptor_reusable.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
88impl<'a> Visitor<'a, u8> for Operator {
89 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
90 Acceptor::new(scanner)
91 .try_or(Operator::Plus)?
92 .try_or(Operator::HelloWorld)?
93 .try_or(Operator::Minus)?
94 .finish()
95 .ok_or(ParseError::UnexpectedToken)
96 }
97}
98
99fn main() -> ParseResult<()> {
100 let data = b"+ 2";
101 let mut scanner = Scanner::new(data);
102 let accepted = Operator::accept(&mut scanner)?;
103
104 println!("{:?}", accepted); let data = b"- 2";
107 let mut scanner = Scanner::new(data);
108 let accepted = Operator::accept(&mut scanner)?;
109
110 println!("{:?}", accepted); let data = b"hello world 2";
113 let mut scanner = Scanner::new(data);
114 let accepted = Operator::accept(&mut scanner)?;
115
116 println!("{:?}", accepted); Ok(())
119}