noa_parser/bytes/primitives/
number.rs

1//! Define the number token and its acceptor.
2
3use crate::bytes::matchers::match_number;
4use crate::errors::ParseResult;
5use crate::matcher::{Match, MatchSize};
6use crate::recognizer::recognize;
7use crate::scanner::Scanner;
8use crate::visitor::Visitor;
9
10pub struct TokenNumber;
11
12/// Implement the `Match` trait for the token number.
13impl Match<u8> for TokenNumber {
14    fn matcher(&self, data: &[u8]) -> (bool, usize) {
15        match_number(data)
16    }
17}
18
19/// Implement the `MatchSize` trait for the token number.
20impl MatchSize for TokenNumber {
21    fn size(&self) -> usize {
22        0
23    }
24}
25
26/// Define how to accept the token number.
27#[derive(Debug, PartialEq)]
28pub struct Number<T>(pub T);
29
30/// Implement the `Visitor` trait for the token number.
31macro_rules! impl_number {
32    ($type:ty) => {
33        impl Visitor<'_, u8> for Number<$type> {
34            fn accept(scanner: &mut Scanner<u8>) -> ParseResult<Self> {
35                let raw_data = recognize(TokenNumber, scanner)?;
36                let str_data = std::str::from_utf8(raw_data)?;
37                let result = str_data.parse::<$type>()?;
38                Ok(Number(result))
39            }
40        }
41    };
42}
43
44impl_number!(usize);
45impl_number!(u8);
46impl_number!(u16);
47impl_number!(u32);
48impl_number!(u64);
49impl_number!(u128);
50impl_number!(isize);
51impl_number!(i8);
52impl_number!(i16);
53impl_number!(i32);
54impl_number!(i64);
55impl_number!(i128);