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