markab_parser/map_parser/
parser.rs1use crate::{
2 map_parser::{
3 MapParserError,
4 MapParserRequirement,
5 },
6 Parser,
7};
8use std::fmt::{
9 Debug,
10 Formatter,
11 Result as FmtResult,
12};
13
14pub struct MapParser<'a, P, R>
15where
16 P: 'a + Parser<'a>,
17{
18 requirement: P,
19 mapper: &'a Fn(P::Output) -> R,
20}
21
22impl<'a, P, R> MapParser<'a, P, R>
23where
24 P: Parser<'a>,
25{
26 pub fn new(requirement: P, mapper: &'a Fn(P::Output) -> R) -> Self
27 {
28 Self {
29 requirement,
30 mapper,
31 }
32 }
33}
34
35impl<'a, P, R> Debug for MapParser<'a, P, R>
36where
37 P: Parser<'a>,
38{
39 fn fmt(&self, f: &mut Formatter) -> FmtResult
40 {
41 f.debug_struct("MapParser")
42 .field("requirement", &self.requirement)
43 .field("mapper", &"..")
44 .finish()
45 }
46}
47
48impl<'a, P, R> Parser<'a> for MapParser<'a, P, R>
49where
50 P: Parser<'a>,
51{
52 type Error = MapParserError<'a, P>;
53 type Output = R;
54 type Requirement = MapParserRequirement<'a, P>;
55 type RequirementContext = ();
56
57 fn parse(&self, src: &'a str, pos: &mut usize) -> Result<Self::Output, Self::Error>
58 {
59 let from = *pos;
60 self.requirement
61 .parse(src, pos)
62 .map(|res| (self.mapper)(res))
63 .map_err(|err| MapParserError::new(from, self.requirement(None), err))
64 }
65
66 fn skip(&self, src: &'a str, pos: &mut usize) -> Result<(), Self::Error>
67 {
68 let from = *pos;
69 self.requirement
70 .skip(src, pos)
71 .map_err(|err| MapParserError::new(from, self.requirement(None), err))
72 }
73
74 fn requirement(&self, _: Option<&Self::RequirementContext>) -> Self::Requirement
75 {
76 MapParserRequirement::new(self.requirement.requirement(None))
77 }
78}
79
80#[test]
81fn test()
82{
83 use crate::string;
84 let parser = string("test");
85 let parser = parser.map(&|s| s.to_owned());
86 let src = "test";
87 let mut pos = 0;
88 let res = parser.parse(src, &mut pos);
89}