separated_list/
separated_list.rs1use elyze::bytes::primitives::number::{Number, TokenNumber};
2use elyze::bytes::token::Token;
3use elyze::errors::ParseResult;
4use elyze::peek::{DefaultPeekableImplementation, PeekSize, PeekableImplementation};
5use elyze::recognizer::recognize;
6use elyze::scanner::Scanner;
7use elyze::separated_list::{get_scanner_without_trailing_separator, SeparatedList};
8use elyze::visitor::Visitor;
9
10#[derive(Debug)]
11struct Separator;
12
13impl PeekableImplementation for Separator {
14 type Type = DefaultPeekableImplementation;
15}
16
17impl<'a> Visitor<'a, u8> for Separator {
18 fn accept(scanner: &mut Scanner<u8>) -> ParseResult<Self> {
19 recognize(Token::Tilde, scanner)?;
20 recognize(Token::Tilde, scanner)?;
21 recognize(Token::Tilde, scanner)?;
22 Ok(Separator)
23 }
24}
25
26impl PeekSize<u8> for Separator {
27 fn peek_size(&self) -> usize {
28 3
29 }
30}
31
32#[derive(Debug)]
33struct NumberList {
34 #[allow(dead_code)]
35 data: Vec<usize>,
36}
37
38impl<'a> Visitor<'a, u8> for NumberList {
39 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
40 let mut data_scanner =
41 get_scanner_without_trailing_separator(TokenNumber, Separator, &scanner)?;
42
43 let data = SeparatedList::<u8, Number<usize>, Separator>::accept(&mut data_scanner)?
44 .data
45 .into_iter()
46 .map(|x| x.0)
47 .collect::<Vec<usize>>();
48
49 scanner.bump_by(scanner.data().len());
50
51 Ok(NumberList { data })
52 }
53}
54
55fn main() -> ParseResult<()> {
56 let data = b"1~~~2~~~3~~~4";
58 let mut scanner = Scanner::new(data);
59
60 let result = NumberList::accept(&mut scanner)?;
61 println!("{:?}", result); let data = b"1~~~2~~~3~~~4~~~";
65 let mut scanner = Scanner::new(data);
66
67 let result = NumberList::accept(&mut scanner)?;
68 println!("{:?}", result); let data = b"1~~~";
72 let mut scanner = Scanner::new(data);
73
74 let result = NumberList::accept(&mut scanner)?;
75 println!("{:?}", result); let data = b"1";
79 let mut scanner = Scanner::new(data);
80
81 let result = NumberList::accept(&mut scanner)?;
82 println!("{:?}", result); let data = b"";
86 let mut scanner = Scanner::new(data);
87
88 let result = NumberList::accept(&mut scanner)?;
89 println!("{:?}", result); let data = b"bad~~~";
93 let mut scanner = Scanner::new(data);
94
95 let result = NumberList::accept(&mut scanner);
96 println!("{:?}", result); Ok(())
99}