binator_utils/
and.rs

1use binator_core::{
2  Parse,
3  Parsed,
4  Success,
5};
6
7/// Implementation of [crate::Utils::and]
8#[derive(Clone)]
9pub struct And<ParserA, ParserB> {
10  parser_a: ParserA,
11  parser_b: ParserB,
12}
13
14impl<TokenA, Stream, Context, ParserA, TokenB, ParserB> Parse<Stream, Context>
15  for And<ParserA, ParserB>
16where
17  ParserA: Parse<Stream, Context, Token = TokenA>,
18  ParserB: Parse<Stream, Context, Token = TokenB>,
19{
20  type Token = (TokenA, TokenB);
21
22  fn parse(&mut self, stream: Stream) -> Parsed<(TokenA, TokenB), Stream, Context> {
23    let Success { token, stream } = self.parser_a.parse(stream)?;
24
25    self
26      .parser_b
27      .parse(stream)
28      .map_token(|token_b| (token, token_b))
29  }
30}
31
32/// Function style version of [crate::Utils::and]
33pub fn and<TokenA, Stream, Context, ParserA, TokenB, ParserB>(
34  parser_a: ParserA, parser_b: ParserB,
35) -> And<ParserA, ParserB>
36where
37  ParserA: Parse<Stream, Context, Token = TokenA>,
38  ParserB: Parse<Stream, Context, Token = TokenB>,
39{
40  And { parser_a, parser_b }
41}