Thanks to visit codestin.com
Credit goes to docs.rs

Skip to main content

markab_parser/sequence_parser/
parser.rs

1use crate::{
2	sequence_parser::{
3		SequenceParserError,
4		SequenceParserRequirement,
5	},
6	Parser,
7};
8use either::{
9	Left,
10	Right,
11};
12use std::marker::PhantomData;
13
14#[derive(Debug)]
15pub struct SequenceParser<'a, P1, P2>
16where
17	P1: Parser<'a>,
18	P2: Parser<'a>,
19{
20	first: P1,
21	second: P2,
22	_a: PhantomData<&'a ()>,
23}
24
25impl<'a, P1, P2> SequenceParser<'a, P1, P2>
26where
27	P1: Parser<'a>,
28	P2: Parser<'a>,
29{
30	pub fn new(first: P1, second: P2) -> Self
31	{
32		Self {
33			first,
34			second,
35			_a: PhantomData,
36		}
37	}
38}
39
40impl<'a, P1, P2> Parser<'a> for SequenceParser<'a, P1, P2>
41where
42	P1: Parser<'a>,
43	P2: Parser<'a>,
44{
45	type Error = SequenceParserError<'a, P1, P2>;
46	type Output = (P1::Output, P2::Output);
47	type Requirement = SequenceParserRequirement<'a, P1, P2>;
48	type RequirementContext = ();
49
50	fn parse(&self, src: &'a str, pos: &mut usize) -> Result<Self::Output, Self::Error>
51	{
52		let from = *pos;
53		let first = self
54			.first
55			.parse(src, pos)
56			.map_err(|err| SequenceParserError::new(from, self.requirement(None), Left(err)))?;
57		let second = self.second.parse(src, pos).map_err(|err| {
58			*pos = from;
59			SequenceParserError::new(from, self.requirement(None), Right(err))
60		})?;
61		Ok((first, second))
62	}
63
64	fn skip(&self, src: &'a str, pos: &mut usize) -> Result<(), Self::Error>
65	{
66		let from = *pos;
67		self.first
68			.skip(src, pos)
69			.map_err(|err| SequenceParserError::new(from, self.requirement(None), Left(err)))
70			.and_then(|_| {
71				self.second.skip(src, pos).map_err(|err| {
72					SequenceParserError::new(from, self.requirement(None), Right(err))
73				})
74			})
75	}
76
77	fn requirement(&self, _: Option<&Self::RequirementContext>) -> Self::Requirement
78	{
79		SequenceParserRequirement::new(self.first.requirement(None), self.second.requirement(None))
80	}
81}