intuicio_parser/
predict.rs

1use 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(&registry, "foobar").unwrap();
48        assert_eq!(rest, "bar");
49    }
50}