xmtp_api_d14n/protocol/extractors/
bytes.rs

1//! turns an envelope back into its protobuf `Body` bytes
2use prost::Message;
3use xmtp_proto::ConversionError;
4use xmtp_proto::xmtp::mls::api::v1::{
5    group_message::V1 as V3GroupMessage, welcome_message::V1 as V3WelcomeMessage,
6};
7use xmtp_proto::xmtp::xmtpv4::envelopes::OriginatorEnvelope;
8
9use crate::protocol::{EnvelopeVisitor, Extractor};
10
11// it should be infalliable that an `Envelope` can be turned back into
12// bytes.
13/// Extract Mls Data from Envelopes
14#[derive(Default, Clone, Debug)]
15pub struct BytesExtractor {
16    buffer: Vec<u8>,
17}
18
19impl BytesExtractor {
20    pub fn new() -> Self {
21        Default::default()
22    }
23}
24
25impl Extractor for BytesExtractor {
26    type Output = Vec<u8>;
27
28    fn get(self) -> Self::Output {
29        self.buffer
30    }
31}
32
33impl EnvelopeVisitor<'_> for BytesExtractor {
34    type Error = ConversionError;
35    fn visit_originator(&mut self, e: &OriginatorEnvelope) -> Result<(), Self::Error> {
36        e.encode(&mut self.buffer)?;
37        Ok(())
38    }
39
40    fn visit_v3_group_message(&mut self, e: &V3GroupMessage) -> Result<(), Self::Error> {
41        e.encode(&mut self.buffer)?;
42        Ok(())
43    }
44
45    fn visit_v3_welcome_message(&mut self, e: &V3WelcomeMessage) -> Result<(), Self::Error> {
46        e.encode(&mut self.buffer)?;
47        Ok(())
48    }
49}