Skip to main content

separated_list/
separated_list.rs

1use 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    // list of elements separated by a separator
57    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); // NumberList { data: [1, 2, 3, 4] }
62
63    // list of elements separated by a separator with trailing separator
64    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); // NumberList { data: [1, 2, 3, 4] }
69
70    // list of 1 element with trailing separator
71    let data = b"1~~~";
72    let mut scanner = Scanner::new(data);
73
74    let result = NumberList::accept(&mut scanner)?;
75    println!("{:?}", result); // NumberList { data: [1] }
76
77    // list of 1 element without trailing separator
78    let data = b"1";
79    let mut scanner = Scanner::new(data);
80
81    let result = NumberList::accept(&mut scanner)?;
82    println!("{:?}", result); // NumberList { data: [1] }
83
84    // list of 0 elements
85    let data = b"";
86    let mut scanner = Scanner::new(data);
87
88    let result = NumberList::accept(&mut scanner)?;
89    println!("{:?}", result); // NumberList { data: [] }
90
91    // bad data
92    let data = b"bad~~~";
93    let mut scanner = Scanner::new(data);
94
95    let result = NumberList::accept(&mut scanner);
96    println!("{:?}", result); // Err(UnexpectedToken)
97
98    Ok(())
99}