jpar/parsers/sequence/
mod.rs1pub 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
11pub 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
33pub 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
48pub 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#[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}