parser_fuck/combinators/
not.rs

1use crate::*;
2use std::marker::PhantomData;
3
4/// Pass if the subparser fail
5#[derive(Debug, PartialEq, Eq, Clone)]
6pub struct Not<A, I = ()> {
7    a: A,
8    _i: PhantomData<I>,
9}
10impl<I: TimeTravel, A> Not<A, I>
11where
12    A: Parser<I>,
13{
14    #[inline]
15    pub fn new(a: A) -> Self {
16        Self { a, _i: PhantomData }
17    }
18}
19impl<I: TimeTravel, A> Parser<I> for Not<A, I>
20where
21    A: Parser<I>,
22{
23    type Output = ();
24
25    fn parse(&self, input: I) -> Option<Self::Output> {
26        let a = self.a.parse(input.ref_clone());
27        if let Some(_) = a {
28            None
29        } else {
30            Some(())
31        }
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use crate::*;
38
39    #[test]
40    fn test() {
41        let code = "asd";
42        let span = code.span();
43        let a = substr("acd");
44        let x = a.not();
45
46        let r = x.parse(span);
47        println!("{:?}", r);
48        assert_eq!(r, Some(()))
49    }
50}