noa_parser/bytes/primitives/
string.rs

1use crate::bytes::matchers::match_string;
2use crate::errors::ParseResult;
3use crate::matcher::{Match, MatchSize};
4use crate::recognizer::recognize;
5use crate::scanner::Scanner;
6use crate::visitor::Visitor;
7use std::borrow::Cow;
8
9struct TokenString;
10
11impl Match<u8> for TokenString {
12    fn matcher(&self, data: &[u8]) -> (bool, usize) {
13        match_string(data)
14    }
15}
16
17impl MatchSize for TokenString {
18    fn size(&self) -> usize {
19        0
20    }
21}
22
23pub struct DataString<T>(pub T);
24
25/// Implement the `Visitor` trait for the token string.
26macro_rules! impl_string {
27    ($type:ty, $a:lifetime) => {
28        impl<$a> Visitor<$a, u8> for DataString<$type> {
29            fn accept(scanner: &mut Scanner<$a, u8>) -> ParseResult<Self> {
30                let raw_data = recognize(TokenString, scanner)?;
31                let str_data = std::str::from_utf8(raw_data)?;
32                Ok(DataString(str_data.into()))
33            }
34        }
35    };
36}
37
38impl_string!(&'a str, 'a);
39impl_string!(String, 'a);
40impl_string!(Cow<'a, str>, 'a);