jpar/parsers/sequence/
mod.rs

1pub use repeats::*;
2pub use tuples::*;
3
4use crate::parsers::helpers::not_found_restore;
5use crate::result::ParserResult;
6use crate::Reader;
7
8mod repeats;
9mod tuples;
10
11/// Matches an object from the first parser and discards it,
12/// then gets an object from the second parser, and finally
13/// matches an object from the third parser and discards it.
14pub fn delimited<'a, Pre, Con, Pos, C, RPre, R, RPos, Err>(
15    mut prefix: Pre,
16    mut content: Con,
17    mut postfix: Pos,
18) -> impl FnMut(&mut Reader<'a, Err, C>) -> ParserResult<R, Err>
19where
20    Pre: FnMut(&mut Reader<'a, Err, C>) -> ParserResult<RPre, Err>,
21    Con: FnMut(&mut Reader<'a, Err, C>) -> ParserResult<R, Err>,
22    Pos: FnMut(&mut Reader<'a, Err, C>) -> ParserResult<RPos, Err>,
23{
24    not_found_restore(move |reader| {
25        let _ = prefix(reader)?;
26        let result = content(reader)?;
27        let _ = postfix(reader)?;
28
29        Ok(result)
30    })
31}
32
33/// Matches an object from the first parser and discards it, then gets an object from the second parser.
34pub fn preceded<'a, Pre, Con, C, RPre, R, Err>(
35    mut prefix: Pre,
36    mut content: Con,
37) -> impl FnMut(&mut Reader<'a, Err, C>) -> ParserResult<R, Err>
38where
39    Pre: FnMut(&mut Reader<'a, Err, C>) -> ParserResult<RPre, Err>,
40    Con: FnMut(&mut Reader<'a, Err, C>) -> ParserResult<R, Err>,
41{
42    not_found_restore(move |reader| {
43        let _ = prefix(reader)?;
44        content(reader)
45    })
46}
47
48/// Gets an object from the first parser, then matches an object from the second parser and discards it.
49pub fn terminated<'a, Con, Pos, C, R, RPos, Err>(
50    mut content: Con,
51    mut postfix: Pos,
52) -> impl FnMut(&mut Reader<'a, Err, C>) -> ParserResult<R, Err>
53where
54    Con: FnMut(&mut Reader<'a, Err, C>) -> ParserResult<R, Err>,
55    Pos: FnMut(&mut Reader<'a, Err, C>) -> ParserResult<RPos, Err>,
56{
57    not_found_restore(move |reader| {
58        let result = content(reader)?;
59        let _ = postfix(reader)?;
60
61        Ok(result)
62    })
63}
64
65// ----------------------------------------------------------------------------
66// ----------------------------------------------------------------------------
67// ----------------------------------------------------------------------------
68
69#[cfg(test)]
70mod test {
71    use crate::parsers::characters::{ascii_alpha1, read_text};
72    use crate::result::ParserResultError;
73
74    use super::*;
75
76    #[test]
77    fn test_delimited() {
78        let mut reader = Reader::new("(abcd)");
79        let mut parser = delimited(read_text("("), ascii_alpha1, read_text(")"));
80        let result = parser(&mut reader);
81        assert_eq!(result, Ok("abcd"));
82
83        let mut reader = Reader::new("abcd)");
84        let result = parser(&mut reader);
85        assert_eq!(result, Err(ParserResultError::NotFound));
86
87        let mut reader = Reader::new("()");
88        let result = parser(&mut reader);
89        assert_eq!(result, Err(ParserResultError::NotFound));
90
91        let mut reader = Reader::new("(abcd");
92        let result = parser(&mut reader);
93        assert_eq!(result, Err(ParserResultError::NotFound));
94    }
95
96    #[test]
97    fn test_preceded() {
98        let mut reader = Reader::new("(abcd)");
99        let mut parser = preceded(read_text("("), ascii_alpha1);
100        let result = parser(&mut reader);
101        assert_eq!(result, Ok("abcd"));
102
103        let mut reader = Reader::new("abcd)");
104        let result = parser(&mut reader);
105        assert_eq!(result, Err(ParserResultError::NotFound));
106
107        let mut reader = Reader::new("()");
108        let result = parser(&mut reader);
109        assert_eq!(result, Err(ParserResultError::NotFound));
110    }
111
112    #[test]
113    fn test_terminated() {
114        let mut reader = Reader::new("abcd)");
115        let mut parser = terminated(ascii_alpha1, read_text(")"));
116        let result = parser(&mut reader);
117        assert_eq!(result, Ok("abcd"));
118
119        let mut reader = Reader::new("abcd");
120        let result = parser(&mut reader);
121        assert_eq!(result, Err(ParserResultError::NotFound));
122
123        let mut reader = Reader::new(")");
124        let result = parser(&mut reader);
125        assert_eq!(result, Err(ParserResultError::NotFound));
126    }
127}