markab_parser/string_parser/
parser.rs

1use crate::{
2	string_parser::StringParserError,
3	Parser,
4};
5
6#[derive(Debug)]
7pub struct StringParser<'a>
8{
9	requirement: &'a str,
10}
11
12impl<'a> StringParser<'a>
13{
14	pub fn new(requirement: &'a str) -> Self
15	{
16		Self { requirement }
17	}
18}
19
20impl<'a> Parser<'a> for StringParser<'a>
21{
22	type Error = StringParserError<'a>;
23	type Output = &'a str;
24	type Requirement = &'a str;
25	type RequirementContext = ();
26
27	fn parse(&self, src: &'a str, pos: &mut usize) -> Result<Self::Output, Self::Error>
28	{
29		let from = *pos;
30		let len = self.requirement.len();
31		if src[from..].starts_with(self.requirement)
32		{
33			*pos += len;
34			Ok(&src[from..*pos])
35		}
36		else
37		{
38			Err(StringParserError::new(from, self.requirement(None), src))
39		}
40	}
41
42	fn requirement(&self, _: Option<&Self::RequirementContext>) -> Self::Requirement
43	{
44		self.requirement
45	}
46}