xmtp_api_d14n/endpoints/v3/
types.rs1use 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#[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#[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}