noa_parser/bytes/primitives/
string.rs

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