aoc_parse/parsers/
string.rs

1//! The parser used by the `string()` function.
2
3use crate::{ParseContext, ParseIter, Parser, Reported, Result};
4
5#[derive(Clone, Copy)]
6pub struct StringParser<P> {
7    pub(crate) parser: P,
8}
9
10pub struct StringParseIter<'parse, P>
11where
12    P: Parser + 'parse,
13{
14    source: &'parse str,
15    start: usize,
16    iter: P::Iter<'parse>,
17}
18
19impl<P> Parser for StringParser<P>
20where
21    P: Parser,
22{
23    type Output = String;
24    type RawOutput = (String,);
25    type Iter<'parse> = StringParseIter<'parse, P>
26    where
27        P: 'parse;
28
29    fn parse_iter<'parse>(
30        &'parse self,
31        context: &mut ParseContext<'parse>,
32        start: usize,
33    ) -> Result<Self::Iter<'parse>, Reported> {
34        let iter = self.parser.parse_iter(context, start)?;
35        Ok(StringParseIter {
36            source: context.source(),
37            start,
38            iter,
39        })
40    }
41}
42
43impl<'parse, P> ParseIter<'parse> for StringParseIter<'parse, P>
44where
45    P: Parser,
46{
47    type RawOutput = (String,);
48
49    fn match_end(&self) -> usize {
50        self.iter.match_end()
51    }
52
53    fn backtrack(&mut self, context: &mut ParseContext<'parse>) -> Result<(), Reported> {
54        self.iter.backtrack(context)
55    }
56
57    fn convert(&self) -> (String,) {
58        let end = self.iter.match_end();
59        let value = self.source[self.start..end].to_string();
60        (value,)
61    }
62}