diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2024-01-15 18:35:00 +0100 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2024-01-22 13:48:32 +0100 |
commit | b838d4b1bfc4b432e908741c94b336df19d201ad (patch) | |
tree | af9d9a77b046f8de9d9887aeae99a683b2c16565 /openpgp/src/parse | |
parent | 96d829d681ea1b860bf4b16439082929f4636147 (diff) |
openpgp: Add Parse::from_buffered_reader.
- Add a buffered-reader-based function to trait Parse. This allows
us to manipulate the buffered reader stack before and after
parsing, e.g. to parse several armored objects in one stream. The
CertParser also does this, but uses internal interfaces for that.
Diffstat (limited to 'openpgp/src/parse')
-rw-r--r-- | openpgp/src/parse/packet_parser_builder.rs | 11 | ||||
-rw-r--r-- | openpgp/src/parse/packet_pile_parser.rs | 7 | ||||
-rw-r--r-- | openpgp/src/parse/stream.rs | 21 |
3 files changed, 39 insertions, 0 deletions
diff --git a/openpgp/src/parse/packet_parser_builder.rs b/openpgp/src/parse/packet_parser_builder.rs index 02a83ad3..2b52efd5 100644 --- a/openpgp/src/parse/packet_parser_builder.rs +++ b/openpgp/src/parse/packet_parser_builder.rs @@ -99,6 +99,17 @@ pub struct PacketParserBuilder<'a> { assert_send_and_sync!(PacketParserBuilder<'_>); impl<'a> Parse<'a, PacketParserBuilder<'a>> for PacketParserBuilder<'a> { + /// Starts parsing an OpenPGP object stored in a `BufferedReader` object. + /// + /// This function returns a `PacketParser` for the first packet in + /// the stream. + fn from_buffered_reader<R>(reader: R) -> Result<PacketParserBuilder<'a>> + where + R: BufferedReader<Cookie> + 'a, + { + PacketParserBuilder::from_cookie_reader(reader.into_boxed()) + } + /// Creates a `PacketParserBuilder` for an OpenPGP message stored /// in a `std::io::Read` object. fn from_reader<R: io::Read + 'a + Send + Sync>(reader: R) -> Result<Self> { diff --git a/openpgp/src/parse/packet_pile_parser.rs b/openpgp/src/parse/packet_pile_parser.rs index ea65912e..b06cf6d8 100644 --- a/openpgp/src/parse/packet_pile_parser.rs +++ b/openpgp/src/parse/packet_pile_parser.rs @@ -218,6 +218,13 @@ impl<'a> TryFrom<PacketParserBuilder<'a>> for PacketPileParser<'a> { } impl<'a> Parse<'a, PacketPileParser<'a>> for PacketPileParser<'a> { + fn from_buffered_reader<R>(reader: R) -> Result<PacketPileParser<'a>> + where + R: BufferedReader<Cookie> + 'a + { + PacketPileParser::from_cookie_reader(reader.into_boxed()) + } + /// Creates a `PacketPileParser` to parse the OpenPGP message stored /// in the `io::Read` object. fn from_reader<R: io::Read + 'a + Send + Sync>(reader: R) diff --git a/openpgp/src/parse/stream.rs b/openpgp/src/parse/stream.rs index 288df6ac..63d42507 100644 --- a/openpgp/src/parse/stream.rs +++ b/openpgp/src/parse/stream.rs @@ -1059,6 +1059,13 @@ assert_send_and_sync!(VerifierBuilder<'_>); impl<'a> Parse<'a, VerifierBuilder<'a>> for VerifierBuilder<'a> { + fn from_buffered_reader<R>(reader: R) -> Result<VerifierBuilder<'a>> + where + R: BufferedReader<Cookie> + 'a, + { + VerifierBuilder::new(reader) + } + fn from_reader<R>(reader: R) -> Result<VerifierBuilder<'a>> where R: io::Read + 'a + Send + Sync, { @@ -1460,6 +1467,13 @@ assert_send_and_sync!(DetachedVerifierBuilder<'_>); impl<'a> Parse<'a, DetachedVerifierBuilder<'a>> for DetachedVerifierBuilder<'a> { + fn from_buffered_reader<R>(reader: R) -> Result<DetachedVerifierBuilder<'a>> + where + R: BufferedReader<Cookie> + 'a, + { + DetachedVerifierBuilder::new(reader) + } + fn from_reader<R>(reader: R) -> Result<DetachedVerifierBuilder<'a>> where R: io::Read + 'a + Send + Sync, { @@ -1817,6 +1831,13 @@ assert_send_and_sync!(DecryptorBuilder<'_>); impl<'a> Parse<'a, DecryptorBuilder<'a>> for DecryptorBuilder<'a> { + fn from_buffered_reader<R>(reader: R) -> Result<DecryptorBuilder<'a>> + where + R: BufferedReader<Cookie> + 'a, + { + DecryptorBuilder::new(reader) + } + fn from_reader<R>(reader: R) -> Result<DecryptorBuilder<'a>> where R: io::Read + 'a + Send + Sync, { |