aoc_parse/parsers/
string.rs1use 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}