mqtt_protocol_core/mqtt/connection/
sendable_role.rs

1/**
2 * MIT License
3 *
4 * Copyright (c) 2025 Takatoshi Kondo
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24use crate::mqtt::connection::role::*;
25use crate::mqtt::packet::*;
26
27/// Role-specific trait to validate that a packet can be sent under a given Role.
28pub trait SendableRole<Role> {}
29
30// --- Role-specific implementations ---
31
32impl SendableRole<Client> for v5_0::Connect {}
33impl SendableRole<Client> for v3_1_1::Connect {}
34
35impl SendableRole<Server> for v5_0::Connack {}
36impl SendableRole<Server> for v3_1_1::Connack {}
37
38impl SendableRole<Any> for v5_0::Connect {}
39impl SendableRole<Any> for v5_0::Connack {}
40impl SendableRole<Any> for v3_1_1::Connect {}
41impl SendableRole<Any> for v3_1_1::Connack {}
42
43// Client sendable packets
44impl SendableRole<Client> for v3_1_1::Pingreq {}
45impl SendableRole<Client> for v3_1_1::Disconnect {}
46
47impl SendableRole<Client> for v5_0::Pingreq {}
48impl SendableRole<Client> for v5_0::Disconnect {}
49impl SendableRole<Client> for v5_0::Auth {}
50
51// Server sendable packets
52impl SendableRole<Server> for v3_1_1::Pingresp {}
53
54impl SendableRole<Server> for v5_0::Pingresp {}
55impl SendableRole<Server> for v5_0::Disconnect {}
56impl SendableRole<Server> for v5_0::Auth {}
57
58// Any role sendable packets (both client and server)
59impl SendableRole<Any> for v3_1_1::Pingreq {}
60impl SendableRole<Any> for v3_1_1::Pingresp {}
61impl SendableRole<Any> for v3_1_1::Disconnect {}
62
63impl SendableRole<Any> for v5_0::Pingreq {}
64impl SendableRole<Any> for v5_0::Pingresp {}
65impl SendableRole<Any> for v5_0::Disconnect {}
66impl SendableRole<Any> for v5_0::Auth {}
67
68// Generic packet implementations for roles
69// Client sendable generic packets
70impl<PacketIdType> SendableRole<Client> for v3_1_1::GenericPublish<PacketIdType> where
71    PacketIdType: crate::mqtt::packet::IsPacketId
72{
73}
74impl<PacketIdType> SendableRole<Client> for v3_1_1::GenericPuback<PacketIdType> where
75    PacketIdType: crate::mqtt::packet::IsPacketId
76{
77}
78impl<PacketIdType> SendableRole<Client> for v3_1_1::GenericPubrec<PacketIdType> where
79    PacketIdType: crate::mqtt::packet::IsPacketId
80{
81}
82impl<PacketIdType> SendableRole<Client> for v3_1_1::GenericPubrel<PacketIdType> where
83    PacketIdType: crate::mqtt::packet::IsPacketId
84{
85}
86impl<PacketIdType> SendableRole<Client> for v3_1_1::GenericPubcomp<PacketIdType> where
87    PacketIdType: crate::mqtt::packet::IsPacketId
88{
89}
90impl<PacketIdType> SendableRole<Client> for v3_1_1::GenericSubscribe<PacketIdType> where
91    PacketIdType: crate::mqtt::packet::IsPacketId
92{
93}
94impl<PacketIdType> SendableRole<Client> for v3_1_1::GenericUnsubscribe<PacketIdType> where
95    PacketIdType: crate::mqtt::packet::IsPacketId
96{
97}
98
99impl<PacketIdType> SendableRole<Client> for v5_0::GenericPublish<PacketIdType> where
100    PacketIdType: crate::mqtt::packet::IsPacketId
101{
102}
103impl<PacketIdType> SendableRole<Client> for v5_0::GenericPuback<PacketIdType> where
104    PacketIdType: crate::mqtt::packet::IsPacketId
105{
106}
107impl<PacketIdType> SendableRole<Client> for v5_0::GenericPubrec<PacketIdType> where
108    PacketIdType: crate::mqtt::packet::IsPacketId
109{
110}
111impl<PacketIdType> SendableRole<Client> for v5_0::GenericPubrel<PacketIdType> where
112    PacketIdType: crate::mqtt::packet::IsPacketId
113{
114}
115impl<PacketIdType> SendableRole<Client> for v5_0::GenericPubcomp<PacketIdType> where
116    PacketIdType: crate::mqtt::packet::IsPacketId
117{
118}
119impl<PacketIdType> SendableRole<Client> for v5_0::GenericSubscribe<PacketIdType> where
120    PacketIdType: crate::mqtt::packet::IsPacketId
121{
122}
123impl<PacketIdType> SendableRole<Client> for v5_0::GenericUnsubscribe<PacketIdType> where
124    PacketIdType: crate::mqtt::packet::IsPacketId
125{
126}
127
128// Server sendable generic packets
129impl<PacketIdType> SendableRole<Server> for v3_1_1::GenericPublish<PacketIdType> where
130    PacketIdType: crate::mqtt::packet::IsPacketId
131{
132}
133impl<PacketIdType> SendableRole<Server> for v3_1_1::GenericPuback<PacketIdType> where
134    PacketIdType: crate::mqtt::packet::IsPacketId
135{
136}
137impl<PacketIdType> SendableRole<Server> for v3_1_1::GenericPubrec<PacketIdType> where
138    PacketIdType: crate::mqtt::packet::IsPacketId
139{
140}
141impl<PacketIdType> SendableRole<Server> for v3_1_1::GenericPubrel<PacketIdType> where
142    PacketIdType: crate::mqtt::packet::IsPacketId
143{
144}
145impl<PacketIdType> SendableRole<Server> for v3_1_1::GenericPubcomp<PacketIdType> where
146    PacketIdType: crate::mqtt::packet::IsPacketId
147{
148}
149impl<PacketIdType> SendableRole<Server> for v3_1_1::GenericSuback<PacketIdType> where
150    PacketIdType: crate::mqtt::packet::IsPacketId
151{
152}
153impl<PacketIdType> SendableRole<Server> for v3_1_1::GenericUnsuback<PacketIdType> where
154    PacketIdType: crate::mqtt::packet::IsPacketId
155{
156}
157
158impl<PacketIdType> SendableRole<Server> for v5_0::GenericPublish<PacketIdType> where
159    PacketIdType: crate::mqtt::packet::IsPacketId
160{
161}
162impl<PacketIdType> SendableRole<Server> for v5_0::GenericPuback<PacketIdType> where
163    PacketIdType: crate::mqtt::packet::IsPacketId
164{
165}
166impl<PacketIdType> SendableRole<Server> for v5_0::GenericPubrec<PacketIdType> where
167    PacketIdType: crate::mqtt::packet::IsPacketId
168{
169}
170impl<PacketIdType> SendableRole<Server> for v5_0::GenericPubrel<PacketIdType> where
171    PacketIdType: crate::mqtt::packet::IsPacketId
172{
173}
174impl<PacketIdType> SendableRole<Server> for v5_0::GenericPubcomp<PacketIdType> where
175    PacketIdType: crate::mqtt::packet::IsPacketId
176{
177}
178impl<PacketIdType> SendableRole<Server> for v5_0::GenericSuback<PacketIdType> where
179    PacketIdType: crate::mqtt::packet::IsPacketId
180{
181}
182impl<PacketIdType> SendableRole<Server> for v5_0::GenericUnsuback<PacketIdType> where
183    PacketIdType: crate::mqtt::packet::IsPacketId
184{
185}
186
187// Any role sendable generic packets
188impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericPublish<PacketIdType> where
189    PacketIdType: crate::mqtt::packet::IsPacketId
190{
191}
192impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericPuback<PacketIdType> where
193    PacketIdType: crate::mqtt::packet::IsPacketId
194{
195}
196impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericPubrec<PacketIdType> where
197    PacketIdType: crate::mqtt::packet::IsPacketId
198{
199}
200impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericPubrel<PacketIdType> where
201    PacketIdType: crate::mqtt::packet::IsPacketId
202{
203}
204impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericPubcomp<PacketIdType> where
205    PacketIdType: crate::mqtt::packet::IsPacketId
206{
207}
208impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericSubscribe<PacketIdType> where
209    PacketIdType: crate::mqtt::packet::IsPacketId
210{
211}
212impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericSuback<PacketIdType> where
213    PacketIdType: crate::mqtt::packet::IsPacketId
214{
215}
216impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericUnsubscribe<PacketIdType> where
217    PacketIdType: crate::mqtt::packet::IsPacketId
218{
219}
220impl<PacketIdType> SendableRole<Any> for v3_1_1::GenericUnsuback<PacketIdType> where
221    PacketIdType: crate::mqtt::packet::IsPacketId
222{
223}
224
225impl<PacketIdType> SendableRole<Any> for v5_0::GenericPublish<PacketIdType> where
226    PacketIdType: crate::mqtt::packet::IsPacketId
227{
228}
229impl<PacketIdType> SendableRole<Any> for v5_0::GenericPuback<PacketIdType> where
230    PacketIdType: crate::mqtt::packet::IsPacketId
231{
232}
233impl<PacketIdType> SendableRole<Any> for v5_0::GenericPubrec<PacketIdType> where
234    PacketIdType: crate::mqtt::packet::IsPacketId
235{
236}
237impl<PacketIdType> SendableRole<Any> for v5_0::GenericPubrel<PacketIdType> where
238    PacketIdType: crate::mqtt::packet::IsPacketId
239{
240}
241impl<PacketIdType> SendableRole<Any> for v5_0::GenericPubcomp<PacketIdType> where
242    PacketIdType: crate::mqtt::packet::IsPacketId
243{
244}
245impl<PacketIdType> SendableRole<Any> for v5_0::GenericSubscribe<PacketIdType> where
246    PacketIdType: crate::mqtt::packet::IsPacketId
247{
248}
249impl<PacketIdType> SendableRole<Any> for v5_0::GenericSuback<PacketIdType> where
250    PacketIdType: crate::mqtt::packet::IsPacketId
251{
252}
253impl<PacketIdType> SendableRole<Any> for v5_0::GenericUnsubscribe<PacketIdType> where
254    PacketIdType: crate::mqtt::packet::IsPacketId
255{
256}
257impl<PacketIdType> SendableRole<Any> for v5_0::GenericUnsuback<PacketIdType> where
258    PacketIdType: crate::mqtt::packet::IsPacketId
259{
260}
261
262// --- Blanket impl to support &T: SendableRole<Role> when T: SendableRole<Role> ---
263
264impl<T, R> SendableRole<R> for &T where T: SendableRole<R> {}