intuicio_parser/
predict.rs1use crate::{ParseResult, Parser, ParserExt, ParserHandle, ParserRegistry};
2
3pub mod shorthand {
4 use super::*;
5
6 pub fn pred(parser: ParserHandle) -> ParserHandle {
7 PredictParser::new(parser).into_handle()
8 }
9}
10
11#[derive(Clone)]
12pub struct PredictParser(ParserHandle);
13
14impl PredictParser {
15 pub fn new(parser: ParserHandle) -> Self {
16 Self(parser)
17 }
18}
19
20impl Parser for PredictParser {
21 fn parse<'a>(&self, registry: &ParserRegistry, input: &'a str) -> ParseResult<'a> {
22 let (_, result) = self.0.parse(registry, input)?;
23 Ok((input, result))
24 }
25
26 fn extend(&self, parser: ParserHandle) {
27 self.0.extend(parser);
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use crate::{
34 predict::PredictParser,
35 shorthand::{lit, pred, seq},
36 ParserRegistry,
37 };
38
39 fn is_async<T: Send + Sync>() {}
40
41 #[test]
42 fn test_predict() {
43 is_async::<PredictParser>();
44
45 let registry = ParserRegistry::default();
46 let sentence = seq([lit("foo"), pred(lit("bar"))]);
47 let (rest, _) = sentence.parse(®istry, "foobar").unwrap();
48 assert_eq!(rest, "bar");
49 }
50}