xmtp_api_d14n/endpoints/v3/
types.rs

1//! V3-Specific Types
2
3use prost::{
4    Message,
5    encoding::{DecodeContext, WireType},
6};
7use xmtp_proto::xmtp::mls::api::v1::{
8    GroupMessage as ProtoGroupMessage, WelcomeMessage as ProtoWelcomeMessage,
9};
10
11use crate::protocol::{
12    EnvelopeError, Extractor, ProtocolEnvelope, V3GroupMessageExtractor, V3WelcomeMessageExtractor,
13};
14
15/// intermediary type to indicate this group message is V3-only
16/// Conversions make assumptions about OriginatorID/sequenceID since this message is
17/// indicated to only come from V3
18#[derive(Default)]
19pub struct V3ProtoGroupMessage {
20    inner: ProtoGroupMessage,
21}
22
23impl TryFrom<V3ProtoGroupMessage> for xmtp_proto::types::GroupMessage {
24    type Error = crate::protocol::traits::EnvelopeError;
25
26    fn try_from(value: V3ProtoGroupMessage) -> Result<Self, Self::Error> {
27        let mut extractor = V3GroupMessageExtractor::default();
28        value.inner.accept(&mut extractor)?;
29        extractor
30            .get()?
31            .ok_or(EnvelopeError::NotFound("v3 message"))
32    }
33}
34
35impl Message for V3ProtoGroupMessage {
36    fn encode_raw(&self, buf: &mut impl prost::bytes::BufMut)
37    where
38        Self: Sized,
39    {
40        self.inner.encode_raw(buf)
41    }
42
43    fn merge_field(
44        &mut self,
45        tag: u32,
46        wire_type: WireType,
47        buf: &mut impl hyper::body::Buf,
48        ctx: DecodeContext,
49    ) -> Result<(), prost::DecodeError>
50    where
51        Self: Sized,
52    {
53        self.inner.merge_field(tag, wire_type, buf, ctx)
54    }
55
56    fn encoded_len(&self) -> usize {
57        self.inner.encoded_len()
58    }
59
60    fn clear(&mut self) {
61        self.inner.clear()
62    }
63}
64
65/// intermediary type to indicate this welcome message is V3-only
66#[derive(Default)]
67pub struct V3ProtoWelcomeMessage {
68    inner: ProtoWelcomeMessage,
69}
70
71impl TryFrom<V3ProtoWelcomeMessage> for xmtp_proto::types::WelcomeMessage {
72    type Error = crate::protocol::traits::EnvelopeError;
73
74    fn try_from(value: V3ProtoWelcomeMessage) -> Result<Self, Self::Error> {
75        let mut extractor = V3WelcomeMessageExtractor::default();
76        value.inner.accept(&mut extractor)?;
77        Ok(extractor.get()?)
78    }
79}
80
81impl Message for V3ProtoWelcomeMessage {
82    fn encode_raw(&self, buf: &mut impl prost::bytes::BufMut)
83    where
84        Self: Sized,
85    {
86        self.inner.encode_raw(buf)
87    }
88
89    fn merge_field(
90        &mut self,
91        tag: u32,
92        wire_type: WireType,
93        buf: &mut impl hyper::body::Buf,
94        ctx: DecodeContext,
95    ) -> Result<(), prost::DecodeError>
96    where
97        Self: Sized,
98    {
99        self.inner.merge_field(tag, wire_type, buf, ctx)
100    }
101
102    fn encoded_len(&self) -> usize {
103        self.inner.encoded_len()
104    }
105
106    fn clear(&mut self) {
107        self.inner.clear()
108    }
109}