binator_utils/
not.rs

1use binator_core::{
2  Contexting,
3  Parse,
4  Parsed,
5};
6
7/// Implementation of [crate::Utils::not]
8#[derive(Clone)]
9pub struct Not<Parser> {
10  parser: Parser,
11}
12
13/// Not Atom
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub enum NotAtom<Token, Stream> {
16  /// Contains Success from the inner parser
17  ParserParsedSuccess(Token, Stream),
18  /// When inner parser Error
19  ParserParsedInvalid,
20}
21
22impl<Stream, Context, Parser> Parse<Stream, Context> for Not<Parser>
23where
24  Stream: Clone,
25  Context: Contexting<NotAtom<Parser::Token, Stream>>,
26  Parser: Parse<Stream, Context>,
27{
28  type Token = Context;
29
30  fn parse(&mut self, stream: Stream) -> Parsed<Context, Stream, Context> {
31    match self.parser.parse(stream.clone()) {
32      Parsed::Success { token, stream } => {
33        Parsed::Failure(Context::new(NotAtom::ParserParsedSuccess(token, stream)))
34      }
35      Parsed::Failure(context) => Parsed::Success {
36        token: context,
37        stream,
38      },
39      Parsed::Error(context) => Parsed::Error(context.add(NotAtom::ParserParsedInvalid)),
40    }
41  }
42}
43
44// evil
45/// Function style version of [crate::Utils::not]
46pub fn not<Stream, Context, Parser>(parser: Parser) -> Not<Parser>
47where
48  Stream: Clone,
49  Context: Contexting<NotAtom<Parser::Token, Stream>>,
50  Parser: Parse<Stream, Context>,
51{
52  Not { parser }
53}