noa_parser/bytes/primitives/
string.rs1use 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
25macro_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);