mqtt_protocol_core/mqtt/connection/
sendable_role.rs

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