xmtp_api_d14n/protocol/impls/
envelope_visitor.rs

1//!  enables combining arbitrary # of visitors into one, ext: process = (ValidateMessage::new(), ExtractMessage::new());
2//! Therefore not re-doing deserialization for each processing step.
3//! Each step is ran sequentially in order, so if one of the steps (like Validation) fails, the whole process
4//! short-circuits. A combinator visitor wrapping a generic EnvelopeVisitor, ie NoFailVisitor<V> can be created in order to avoid short-circuiting and
5//! store the errors somewhere else
6
7use crate::protocol::{EnvelopeError, EnvelopeVisitor};
8use impl_trait_for_tuples::impl_for_tuples;
9use xmtp_proto::identity_v1::get_identity_updates_request;
10use xmtp_proto::identity_v1::get_identity_updates_response::IdentityUpdateLog;
11use xmtp_proto::mls_v1::fetch_key_packages_response::KeyPackage;
12use xmtp_proto::mls_v1::subscribe_group_messages_request::Filter as SubscribeGroupMessagesFilter;
13use xmtp_proto::mls_v1::subscribe_welcome_messages_request::Filter as SubscribeWelcomeMessagesFilter;
14use xmtp_proto::xmtp::identity::associations::IdentityUpdate;
15use xmtp_proto::xmtp::mls::api::v1::GroupMessageInput;
16use xmtp_proto::xmtp::mls::api::v1::UploadKeyPackageRequest;
17use xmtp_proto::xmtp::mls::api::v1::WelcomeMessageInput;
18use xmtp_proto::xmtp::mls::api::v1::{
19    group_message::V1 as V3GroupMessage, welcome_message::V1 as V3WelcomeMessage,
20};
21use xmtp_proto::xmtp::mls::api::v1::{
22    group_message_input::{V1 as GroupMessageV1, Version as GroupMessageVersion},
23    welcome_message_input::{V1 as WelcomeMessageV1, Version as WelcomeMessageVersion},
24};
25use xmtp_proto::xmtp::xmtpv4::envelopes::{
26    ClientEnvelope, OriginatorEnvelope, PayerEnvelope, UnsignedOriginatorEnvelope,
27};
28use xmtp_proto::xmtp::xmtpv4::message_api::get_newest_envelope_response;
29
30type ForError<'a, V> = <V as EnvelopeVisitor<'a>>::Error;
31
32#[impl_for_tuples(1, 6)]
33impl<'a> EnvelopeVisitor<'a> for Tuple {
34    type Error = EnvelopeError;
35
36    for_tuples!( where #( EnvelopeError: From<ForError<'a, Tuple>> )* );
37
38    fn visit_originator(&mut self, envelope: &OriginatorEnvelope) -> Result<(), Self::Error> {
39        for_tuples!( #( Tuple.visit_originator(envelope)?; )* );
40        Ok(())
41    }
42
43    fn visit_unsigned_originator(
44        &mut self,
45        e: &UnsignedOriginatorEnvelope,
46    ) -> Result<(), Self::Error> {
47        for_tuples!( #( Tuple.visit_unsigned_originator(e)?; )* );
48        Ok(())
49    }
50
51    fn visit_payer(&mut self, e: &PayerEnvelope) -> Result<(), Self::Error> {
52        for_tuples!( #( Tuple.visit_payer(e)?; )* );
53        Ok(())
54    }
55
56    fn visit_client(&mut self, e: &ClientEnvelope) -> Result<(), Self::Error> {
57        for_tuples!( #( Tuple.visit_client(e)?; )* );
58        Ok(())
59    }
60
61    fn visit_group_message_version(&mut self, m: &GroupMessageVersion) -> Result<(), Self::Error> {
62        for_tuples!( #( Tuple.visit_group_message_version(m)?; )* );
63        Ok(())
64    }
65
66    fn visit_group_message_input(&mut self, m: &GroupMessageInput) -> Result<(), Self::Error> {
67        for_tuples!( #( Tuple.visit_group_message_input(m)?; )* );
68        Ok(())
69    }
70
71    fn visit_group_message_v1(&mut self, m: &GroupMessageV1) -> Result<(), Self::Error> {
72        for_tuples!( #( Tuple.visit_group_message_v1(m)?; )* );
73        Ok(())
74    }
75
76    fn visit_welcome_message_version(
77        &mut self,
78        m: &WelcomeMessageVersion,
79    ) -> Result<(), Self::Error> {
80        for_tuples!( #( Tuple.visit_welcome_message_version(m)?; )* );
81        Ok(())
82    }
83
84    fn visit_welcome_message_input(&mut self, m: &WelcomeMessageInput) -> Result<(), Self::Error> {
85        for_tuples!( #( Tuple.visit_welcome_message_input(m)?; )* );
86        Ok(())
87    }
88
89    fn visit_welcome_message_v1(&mut self, m: &WelcomeMessageV1) -> Result<(), Self::Error> {
90        for_tuples!( #( Tuple.visit_welcome_message_v1(m)?; )* );
91        Ok(())
92    }
93
94    fn visit_v3_group_message(&mut self, m: &V3GroupMessage) -> Result<(), Self::Error> {
95        for_tuples!( #( Tuple.visit_v3_group_message(m)?; )* );
96        Ok(())
97    }
98
99    fn visit_v3_welcome_message(&mut self, m: &V3WelcomeMessage) -> Result<(), Self::Error> {
100        for_tuples!( #( Tuple.visit_v3_welcome_message(m)?; )* );
101        Ok(())
102    }
103
104    fn visit_upload_key_package(&mut self, p: &UploadKeyPackageRequest) -> Result<(), Self::Error> {
105        for_tuples!( #( Tuple.visit_upload_key_package(p)?; )* );
106        Ok(())
107    }
108
109    fn visit_identity_update(&mut self, u: &IdentityUpdate) -> Result<(), Self::Error> {
110        for_tuples!( #( Tuple.visit_identity_update(u)?; )* );
111        Ok(())
112    }
113
114    fn visit_identity_update_log(&mut self, u: &IdentityUpdateLog) -> Result<(), Self::Error> {
115        for_tuples!( #( Tuple.visit_identity_update_log(u)?; )* );
116        Ok(())
117    }
118
119    fn visit_identity_updates_request(
120        &mut self,
121        u: &get_identity_updates_request::Request,
122    ) -> Result<(), Self::Error> {
123        for_tuples!( #( Tuple.visit_identity_updates_request(u)?; )* );
124        Ok(())
125    }
126
127    fn visit_key_package(&mut self, k: &KeyPackage) -> Result<(), Self::Error> {
128        for_tuples!( #( Tuple.visit_key_package(k)?; )* );
129        Ok(())
130    }
131
132    fn visit_none(&mut self) -> Result<(), Self::Error> {
133        for_tuples!( #( Tuple.visit_none()?; )* );
134        Ok(())
135    }
136
137    /// Visit a Newest Envelope Response
138    fn visit_newest_envelope_response(
139        &mut self,
140        u: &get_newest_envelope_response::Response,
141    ) -> Result<(), Self::Error> {
142        for_tuples!( #( Tuple.visit_newest_envelope_response(u)?; )* );
143        Ok(())
144    }
145
146    /// visit_subscribe_group_messages_request
147    fn visit_subscribe_group_messages_request(
148        &mut self,
149        r: &SubscribeGroupMessagesFilter,
150    ) -> Result<(), Self::Error> {
151        for_tuples!( #( Tuple.visit_subscribe_group_messages_request(r)?; )* );
152        Ok(())
153    }
154
155    /// visit_subscribe_group_messages_request
156    fn visit_subscribe_welcome_messages_request(
157        &mut self,
158        r: &SubscribeWelcomeMessagesFilter,
159    ) -> Result<(), Self::Error> {
160        for_tuples!( #( Tuple.visit_subscribe_welcome_messages_request(r)?; )* );
161        Ok(())
162    }
163
164    #[cfg(any(test, feature = "test-utils"))]
165    fn test_visit_u32(&mut self, n: &u32) -> Result<(), Self::Error> {
166        for_tuples!( #( Tuple.test_visit_u32(n)?; )* );
167        Ok(())
168    }
169}
170
171// run extractors of the same type in sequence
172impl<'a, T> EnvelopeVisitor<'a> for Vec<T>
173where
174    T: EnvelopeVisitor<'a>,
175    T::Error: std::error::Error,
176{
177    type Error = T::Error;
178
179    fn visit_originator(&mut self, envelope: &OriginatorEnvelope) -> Result<(), Self::Error> {
180        self.iter_mut()
181            .try_for_each(|t| t.visit_originator(envelope))?;
182        Ok(())
183    }
184
185    fn visit_unsigned_originator(
186        &mut self,
187        envelope: &UnsignedOriginatorEnvelope,
188    ) -> Result<(), Self::Error> {
189        self.iter_mut()
190            .try_for_each(|t| t.visit_unsigned_originator(envelope))?;
191        Ok(())
192    }
193
194    fn visit_payer(&mut self, envelope: &PayerEnvelope) -> Result<(), Self::Error> {
195        self.iter_mut().try_for_each(|t| t.visit_payer(envelope))?;
196        Ok(())
197    }
198
199    fn visit_client(&mut self, envelope: &ClientEnvelope) -> Result<(), Self::Error> {
200        self.iter_mut().try_for_each(|t| t.visit_client(envelope))?;
201        Ok(())
202    }
203
204    fn visit_group_message_version(
205        &mut self,
206        message: &GroupMessageVersion,
207    ) -> Result<(), Self::Error> {
208        self.iter_mut()
209            .try_for_each(|t| t.visit_group_message_version(message))?;
210        Ok(())
211    }
212
213    fn visit_group_message_input(&mut self, m: &GroupMessageInput) -> Result<(), Self::Error> {
214        self.iter_mut()
215            .try_for_each(|t| t.visit_group_message_input(m))?;
216        Ok(())
217    }
218
219    fn visit_group_message_v1(&mut self, message: &GroupMessageV1) -> Result<(), Self::Error> {
220        self.iter_mut()
221            .try_for_each(|t| t.visit_group_message_v1(message))?;
222        Ok(())
223    }
224
225    fn visit_welcome_message_version(
226        &mut self,
227        message: &WelcomeMessageVersion,
228    ) -> Result<(), Self::Error> {
229        self.iter_mut()
230            .try_for_each(|t| t.visit_welcome_message_version(message))?;
231        Ok(())
232    }
233
234    fn visit_welcome_message_input(&mut self, m: &WelcomeMessageInput) -> Result<(), Self::Error> {
235        self.iter_mut()
236            .try_for_each(|t| t.visit_welcome_message_input(m))?;
237        Ok(())
238    }
239
240    fn visit_welcome_message_v1(&mut self, message: &WelcomeMessageV1) -> Result<(), Self::Error> {
241        self.iter_mut()
242            .try_for_each(|t| t.visit_welcome_message_v1(message))?;
243        Ok(())
244    }
245
246    fn visit_v3_group_message(&mut self, m: &V3GroupMessage) -> Result<(), Self::Error> {
247        self.iter_mut()
248            .try_for_each(|t| t.visit_v3_group_message(m))?;
249        Ok(())
250    }
251
252    fn visit_v3_welcome_message(&mut self, m: &V3WelcomeMessage) -> Result<(), Self::Error> {
253        self.iter_mut()
254            .try_for_each(|t| t.visit_v3_welcome_message(m))?;
255        Ok(())
256    }
257
258    fn visit_upload_key_package(
259        &mut self,
260        package: &UploadKeyPackageRequest,
261    ) -> Result<(), Self::Error> {
262        self.iter_mut()
263            .try_for_each(|t| t.visit_upload_key_package(package))?;
264        Ok(())
265    }
266
267    fn visit_identity_update(&mut self, update: &IdentityUpdate) -> Result<(), Self::Error> {
268        self.iter_mut()
269            .try_for_each(|t| t.visit_identity_update(update))?;
270        Ok(())
271    }
272
273    fn visit_identity_update_log(&mut self, u: &IdentityUpdateLog) -> Result<(), Self::Error> {
274        self.iter_mut()
275            .try_for_each(|t| t.visit_identity_update_log(u))?;
276        Ok(())
277    }
278
279    /// Visit an Identity Updates Request
280    fn visit_identity_updates_request(
281        &mut self,
282        u: &get_identity_updates_request::Request,
283    ) -> Result<(), Self::Error> {
284        self.iter_mut()
285            .try_for_each(|t| t.visit_identity_updates_request(u))?;
286        Ok(())
287    }
288
289    fn visit_key_package(&mut self, k: &KeyPackage) -> Result<(), Self::Error> {
290        self.iter_mut().try_for_each(|t| t.visit_key_package(k))?;
291        Ok(())
292    }
293
294    /// Visit an empty type in a fixed-length array
295    /// Useful is client expects a constant length between
296    /// requests and responses
297    fn visit_none(&mut self) -> Result<(), Self::Error> {
298        self.iter_mut().try_for_each(|t| t.visit_none())?;
299        Ok(())
300    }
301
302    /// Visit a Newest Envelope Response
303    fn visit_newest_envelope_response(
304        &mut self,
305        u: &get_newest_envelope_response::Response,
306    ) -> Result<(), Self::Error> {
307        self.iter_mut()
308            .try_for_each(|t| t.visit_newest_envelope_response(u))?;
309        Ok(())
310    }
311
312    /// visit_subscribe_group_messages_request
313    fn visit_subscribe_group_messages_request(
314        &mut self,
315        r: &SubscribeGroupMessagesFilter,
316    ) -> Result<(), Self::Error> {
317        self.iter_mut()
318            .try_for_each(|t| t.visit_subscribe_group_messages_request(r))?;
319        Ok(())
320    }
321
322    /// visit_subscribe_group_messages_request
323    fn visit_subscribe_welcome_messages_request(
324        &mut self,
325        r: &SubscribeWelcomeMessagesFilter,
326    ) -> Result<(), Self::Error> {
327        self.iter_mut()
328            .try_for_each(|t| t.visit_subscribe_welcome_messages_request(r))?;
329        Ok(())
330    }
331
332    #[cfg(any(test, feature = "test-utils"))]
333    fn test_visit_u32(&mut self, n: &u32) -> Result<(), Self::Error> {
334        self.iter_mut().try_for_each(|t| t.test_visit_u32(n))?;
335        Ok(())
336    }
337}