xmtp_api_d14n/protocol/extractors/
data.rs1use xmtp_common::sha256_bytes;
4use xmtp_proto::ConversionError;
5use xmtp_proto::mls_v1::group_message_input::V1 as GroupMessageV1;
6use xmtp_proto::mls_v1::welcome_message_input::V1 as WelcomeMessageV1;
7use xmtp_proto::xmtp::mls::api::v1::{
8 group_message::V1 as V3GroupMessage, welcome_message::V1 as V3WelcomeMessage,
9};
10
11use crate::protocol::{EnvelopeVisitor, Extractor};
12
13#[derive(Default, Clone, Debug)]
15pub struct MlsDataExtractor {
16 data: Option<Vec<u8>>,
17}
18
19impl MlsDataExtractor {
20 pub fn new() -> Self {
21 Default::default()
22 }
23
24 pub fn get_sha256(self) -> <Self as Extractor>::Output {
25 let data = self.get()?;
26 Ok(sha256_bytes(&data))
28 }
29}
30
31impl Extractor for MlsDataExtractor {
32 type Output = Result<Vec<u8>, ConversionError>;
33
34 fn get(self) -> Self::Output {
35 self.data.ok_or(ConversionError::Missing {
36 item: "MlsDataEnvelope",
37 r#type: std::any::type_name::<Vec<u8>>(),
38 })
39 }
40}
41
42impl EnvelopeVisitor<'_> for MlsDataExtractor {
43 type Error = ConversionError;
44
45 fn visit_welcome_message_v1(&mut self, message: &WelcomeMessageV1) -> Result<(), Self::Error> {
46 self.data = Some(message.data.clone());
47 Ok(())
48 }
49
50 fn visit_group_message_v1(&mut self, message: &GroupMessageV1) -> Result<(), Self::Error> {
51 self.data = Some(message.data.clone());
52 Ok(())
53 }
54
55 fn visit_v3_group_message(&mut self, message: &V3GroupMessage) -> Result<(), Self::Error> {
56 self.data = Some(message.data.clone());
57 Ok(())
58 }
59
60 fn visit_v3_welcome_message(&mut self, message: &V3WelcomeMessage) -> Result<(), Self::Error> {
61 self.data = Some(message.data.clone());
62 Ok(())
63 }
64}