markab_parser/sequence_parser/
parser.rs1use 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}