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

Skip to main content

markab_parser/map_parser/
parser.rs

1use 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}