turbofish_data_visitor/
turbofish_data_visitor.rs

1use noa_parser::bytes::primitives::number::Number;
2use noa_parser::bytes::token::Token;
3use noa_parser::errors::ParseResult;
4use noa_parser::recognizer::recognize;
5use noa_parser::scanner::Scanner;
6use noa_parser::visitor::Visitor;
7
8#[derive(Debug)]
9#[allow(dead_code)]
10struct Turbofish(usize);
11
12struct TurbofishStartTokens;
13
14// Implement the `Visitor` trait for the turbofish operator start tokens.
15impl<'a> Visitor<'a, u8> for TurbofishStartTokens {
16    fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
17        // recognize the turbofish operator start "::<".
18        recognize(Token::Colon, scanner)?;
19        recognize(Token::Colon, scanner)?;
20        recognize(Token::LessThan, scanner)?;
21        Ok(TurbofishStartTokens)
22    }
23}
24
25// Implement the `Visitor` trait for the turbofish operator.
26impl<'a> Visitor<'a, u8> for Turbofish {
27    fn accept(scanner: &mut noa_parser::scanner::Scanner<u8>) -> ParseResult<Self> {
28        // recognize the turbofish operator start "::<".
29        TurbofishStartTokens::accept(scanner)?;
30        // recognize the number
31        let number = Number::accept(scanner)?.0;
32        // recognize the turbofish operator end ">"
33        recognize(Token::GreaterThan, scanner)?;
34        Ok(Turbofish(number))
35    }
36}
37
38fn main() {
39    let data = b"::<45>garbage";
40    let mut scanner = noa_parser::scanner::Scanner::new(data);
41    let result = Turbofish::accept(&mut scanner);
42    println!("{:?}", result); // Ok(Turbofish(45))
43}