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