binator/utils/
and_drop.rs

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