xmtp_api_d14n/protocol/
macros.rs

1/// Macro to delegate `EnvelopeVisitor` implementation to an `inner` field.
2///
3/// This macro generates a complete `EnvelopeVisitor` implementation for a struct
4/// that contains an `inner` field implementing `EnvelopeVisitor` (typically a tuple
5/// of extractors).
6///
7/// # Example
8///
9/// ```rust
10/// use xmtp_api_d14n::protocol::extractors::{DependsOnExtractor, BytesExtractor};
11/// use xmtp_api_d14n::delegate_envelope_visitor;
12///
13/// struct MyExtractor {
14///     inner: (DependsOnExtractor, BytesExtractor)
15/// }
16///
17/// delegate_envelope_visitor!(MyExtractor);
18/// ```
19///
20/// The generated implementation delegates all visitor methods to the `inner` field,
21/// allowing you to compose multiple extractors without manually implementing each
22/// method. This is particularly useful when you want to wrap a tuple of extractors
23/// in a named struct for better type safety and API clarity.
24#[macro_export]
25macro_rules! delegate_envelope_visitor {
26    ($struct_name:ident) => {
27        impl<'env> $crate::protocol::EnvelopeVisitor<'env> for $struct_name {
28            type Error = $crate::protocol::EnvelopeError;
29
30            fn visit_originator(
31                &mut self,
32                e: &xmtp_proto::xmtp::xmtpv4::envelopes::OriginatorEnvelope,
33            ) -> Result<(), Self::Error> {
34                self.inner.visit_originator(e)
35            }
36
37            fn visit_unsigned_originator(
38                &mut self,
39                e: &xmtp_proto::xmtp::xmtpv4::envelopes::UnsignedOriginatorEnvelope,
40            ) -> Result<(), Self::Error> {
41                self.inner.visit_unsigned_originator(e)
42            }
43
44            fn visit_payer(
45                &mut self,
46                e: &xmtp_proto::xmtp::xmtpv4::envelopes::PayerEnvelope,
47            ) -> Result<(), Self::Error> {
48                self.inner.visit_payer(e)
49            }
50
51            fn visit_client(
52                &mut self,
53                e: &xmtp_proto::xmtp::xmtpv4::envelopes::ClientEnvelope,
54            ) -> Result<(), Self::Error> {
55                self.inner.visit_client(e)
56            }
57
58            fn visit_group_message_version(
59                &mut self,
60                m: &xmtp_proto::xmtp::mls::api::v1::group_message_input::Version,
61            ) -> Result<(), Self::Error> {
62                self.inner.visit_group_message_version(m)
63            }
64
65            fn visit_group_message_input(
66                &mut self,
67                m: &xmtp_proto::xmtp::mls::api::v1::GroupMessageInput,
68            ) -> Result<(), Self::Error> {
69                self.inner.visit_group_message_input(m)
70            }
71
72            fn visit_group_message_v1(
73                &mut self,
74                m: &xmtp_proto::xmtp::mls::api::v1::group_message_input::V1,
75            ) -> Result<(), Self::Error> {
76                self.inner.visit_group_message_v1(m)
77            }
78
79            fn visit_welcome_message_version(
80                &mut self,
81                m: &xmtp_proto::xmtp::mls::api::v1::welcome_message_input::Version,
82            ) -> Result<(), Self::Error> {
83                self.inner.visit_welcome_message_version(m)
84            }
85
86            fn visit_welcome_message_input(
87                &mut self,
88                m: &xmtp_proto::xmtp::mls::api::v1::WelcomeMessageInput,
89            ) -> Result<(), Self::Error> {
90                self.inner.visit_welcome_message_input(m)
91            }
92
93            fn visit_welcome_message_v1(
94                &mut self,
95                m: &xmtp_proto::xmtp::mls::api::v1::welcome_message_input::V1,
96            ) -> Result<(), Self::Error> {
97                self.inner.visit_welcome_message_v1(m)
98            }
99
100            fn visit_welcome_pointer(
101                &mut self,
102                m: &xmtp_proto::xmtp::mls::api::v1::welcome_message_input::WelcomePointer,
103            ) -> Result<(), Self::Error> {
104                self.inner.visit_welcome_pointer(m)
105            }
106
107            fn visit_v3_group_message(
108                &mut self,
109                m: &xmtp_proto::xmtp::mls::api::v1::group_message::V1,
110            ) -> Result<(), Self::Error> {
111                self.inner.visit_v3_group_message(m)
112            }
113
114            fn visit_v3_welcome_message(
115                &mut self,
116                m: &xmtp_proto::xmtp::mls::api::v1::welcome_message::V1,
117            ) -> Result<(), Self::Error> {
118                self.inner.visit_v3_welcome_message(m)
119            }
120
121            fn visit_v3_welcome_pointer(
122                &mut self,
123                m: &xmtp_proto::xmtp::mls::api::v1::welcome_message::WelcomePointer,
124            ) -> Result<(), Self::Error> {
125                self.inner.visit_v3_welcome_pointer(m)
126            }
127
128            fn visit_upload_key_package(
129                &mut self,
130                p: &xmtp_proto::xmtp::mls::api::v1::UploadKeyPackageRequest,
131            ) -> Result<(), Self::Error> {
132                self.inner.visit_upload_key_package(p)
133            }
134
135            fn visit_identity_update(
136                &mut self,
137                u: &xmtp_proto::xmtp::identity::associations::IdentityUpdate,
138            ) -> Result<(), Self::Error> {
139                self.inner.visit_identity_update(u)
140            }
141
142            fn visit_identity_update_log(
143                &mut self,
144                u: &xmtp_proto::identity_v1::get_identity_updates_response::IdentityUpdateLog,
145            ) -> Result<(), Self::Error> {
146                self.inner.visit_identity_update_log(u)
147            }
148
149            fn visit_identity_updates_request(
150                &mut self,
151                u: &xmtp_proto::identity_v1::get_identity_updates_request::Request,
152            ) -> Result<(), Self::Error> {
153                self.inner.visit_identity_updates_request(u)
154            }
155
156            fn visit_key_package(
157                &mut self,
158                k: &xmtp_proto::mls_v1::fetch_key_packages_response::KeyPackage,
159            ) -> Result<(), Self::Error> {
160                self.inner.visit_key_package(k)
161            }
162
163            fn visit_none(&mut self) -> Result<(), Self::Error> {
164                self.inner.visit_none()
165            }
166
167            fn visit_newest_envelope_response(
168                &mut self,
169                u: &xmtp_proto::xmtp::xmtpv4::message_api::get_newest_envelope_response::Response,
170            ) -> Result<(), Self::Error> {
171                self.inner.visit_newest_envelope_response(u)
172            }
173
174            fn visit_subscribe_group_messages_request(
175                &mut self,
176                r: &xmtp_proto::mls_v1::subscribe_group_messages_request::Filter,
177            ) -> Result<(), Self::Error> {
178                self.inner.visit_subscribe_group_messages_request(r)
179            }
180
181            fn visit_subscribe_welcome_messages_request(
182                &mut self,
183                r: &xmtp_proto::mls_v1::subscribe_welcome_messages_request::Filter,
184            ) -> Result<(), Self::Error> {
185                self.inner.visit_subscribe_welcome_messages_request(r)
186            }
187
188            fn visit_newest_group_message_response(
189                &mut self,
190                u: &xmtp_proto::xmtp::mls::api::v1::get_newest_group_message_response::Response,
191            ) -> Result<(), Self::Error> {
192                self.inner.visit_newest_group_message_response(u)
193            }
194
195            #[cfg(any(test, feature = "test-utils"))]
196            fn test_visit_u32(&mut self, n: &u32) -> Result<(), Self::Error> {
197                self.inner.test_visit_u32(n)
198            }
199        }
200    };
201}