1use super::message_ops::Sealed;
2use super::{
3 Message, MessageDeserializeError, MessageKind, MessageOps, MessageSerializeError,
4 MessageSerializer, MessageWithoutValueDeserializer, OptionKind,
5};
6use crate::{
7 BusEvent, BusListenerCookie, ObjectId, SerializedValue, SerializedValueSlice, ServiceId,
8};
9use bytes::BytesMut;
10use num_enum::{IntoPrimitive, TryFromPrimitive};
11
12#[derive(Debug, Copy, Clone, PartialEq, Eq)]
13#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
14pub struct EmitBusEvent {
15 pub cookie: Option<BusListenerCookie>,
16 pub event: BusEvent,
17}
18
19impl MessageOps for EmitBusEvent {
20 fn kind(&self) -> MessageKind {
21 MessageKind::EmitBusEvent
22 }
23
24 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
25 let mut serializer = MessageSerializer::without_value(MessageKind::EmitBusEvent);
26
27 match self.cookie {
28 Some(cookie) => {
29 serializer.put_discriminant_u8(OptionKind::Some);
30 serializer.put_uuid(cookie.0);
31 }
32
33 None => serializer.put_discriminant_u8(OptionKind::None),
34 }
35
36 match self.event {
37 BusEvent::ObjectCreated(object) => {
38 serializer.put_discriminant_u8(BusEventKind::ObjectCreated);
39 serializer.put_uuid(object.uuid.0);
40 serializer.put_uuid(object.cookie.0);
41 }
42
43 BusEvent::ObjectDestroyed(object) => {
44 serializer.put_discriminant_u8(BusEventKind::ObjectDestroyed);
45 serializer.put_uuid(object.uuid.0);
46 serializer.put_uuid(object.cookie.0);
47 }
48
49 BusEvent::ServiceCreated(service) => {
50 serializer.put_discriminant_u8(BusEventKind::ServiceCreated);
51 serializer.put_uuid(service.object_id.uuid.0);
52 serializer.put_uuid(service.object_id.cookie.0);
53 serializer.put_uuid(service.uuid.0);
54 serializer.put_uuid(service.cookie.0);
55 }
56
57 BusEvent::ServiceDestroyed(service) => {
58 serializer.put_discriminant_u8(BusEventKind::ServiceDestroyed);
59 serializer.put_uuid(service.object_id.uuid.0);
60 serializer.put_uuid(service.object_id.cookie.0);
61 serializer.put_uuid(service.uuid.0);
62 serializer.put_uuid(service.cookie.0);
63 }
64 }
65
66 serializer.finish()
67 }
68
69 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
70 let mut deserializer =
71 MessageWithoutValueDeserializer::new(buf, MessageKind::EmitBusEvent)?;
72
73 let cookie = match deserializer.try_get_discriminant_u8()? {
74 OptionKind::Some => deserializer
75 .try_get_uuid()
76 .map(BusListenerCookie::from)
77 .map(Some)?,
78
79 OptionKind::None => None,
80 };
81
82 let event = match deserializer.try_get_discriminant_u8()? {
83 BusEventKind::ObjectCreated => {
84 let object_uuid = deserializer.try_get_uuid()?.into();
85 let object_cookie = deserializer.try_get_uuid()?.into();
86
87 BusEvent::ObjectCreated(ObjectId::new(object_uuid, object_cookie))
88 }
89
90 BusEventKind::ObjectDestroyed => {
91 let object_uuid = deserializer.try_get_uuid()?.into();
92 let object_cookie = deserializer.try_get_uuid()?.into();
93
94 BusEvent::ObjectDestroyed(ObjectId::new(object_uuid, object_cookie))
95 }
96
97 BusEventKind::ServiceCreated => {
98 let object_uuid = deserializer.try_get_uuid()?.into();
99 let object_cookie = deserializer.try_get_uuid()?.into();
100 let service_uuid = deserializer.try_get_uuid()?.into();
101 let service_cookie = deserializer.try_get_uuid()?.into();
102
103 BusEvent::ServiceCreated(ServiceId::new(
104 ObjectId::new(object_uuid, object_cookie),
105 service_uuid,
106 service_cookie,
107 ))
108 }
109
110 BusEventKind::ServiceDestroyed => {
111 let object_uuid = deserializer.try_get_uuid()?.into();
112 let object_cookie = deserializer.try_get_uuid()?.into();
113 let service_uuid = deserializer.try_get_uuid()?.into();
114 let service_cookie = deserializer.try_get_uuid()?.into();
115
116 BusEvent::ServiceDestroyed(ServiceId::new(
117 ObjectId::new(object_uuid, object_cookie),
118 service_uuid,
119 service_cookie,
120 ))
121 }
122 };
123
124 deserializer.finish()?;
125
126 Ok(Self { cookie, event })
127 }
128
129 fn value(&self) -> Option<&SerializedValueSlice> {
130 None
131 }
132
133 fn value_mut(&mut self) -> Option<&mut SerializedValue> {
134 None
135 }
136}
137
138impl Sealed for EmitBusEvent {}
139
140impl From<EmitBusEvent> for Message {
141 fn from(msg: EmitBusEvent) -> Self {
142 Self::EmitBusEvent(msg)
143 }
144}
145
146#[cfg(test)]
147mod test {
148 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
149 use super::super::Message;
150 use super::EmitBusEvent;
151 use crate::{BusEvent, BusListenerCookie, ObjectId, ServiceId};
152 use uuid::uuid;
153
154 #[test]
155 fn object_created_without_cookie() {
156 let serialized = [
157 39, 0, 0, 0, 44, 0, 0, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
158 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
159 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
160 ];
161
162 let msg = EmitBusEvent {
163 cookie: None,
164 event: BusEvent::ObjectCreated(ObjectId::new(
165 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
166 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
167 )),
168 };
169 assert_serialize_eq(&msg, serialized);
170 assert_deserialize_eq(&msg, serialized);
171
172 let msg = Message::EmitBusEvent(msg);
173 assert_serialize_eq(&msg, serialized);
174 assert_deserialize_eq(&msg, serialized);
175 }
176
177 #[test]
178 fn object_destroyed_without_cookie() {
179 let serialized = [
180 39, 0, 0, 0, 44, 0, 1, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
181 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
182 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
183 ];
184
185 let msg = EmitBusEvent {
186 cookie: None,
187 event: BusEvent::ObjectDestroyed(ObjectId::new(
188 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
189 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
190 )),
191 };
192 assert_serialize_eq(&msg, serialized);
193 assert_deserialize_eq(&msg, serialized);
194
195 let msg = Message::EmitBusEvent(msg);
196 assert_serialize_eq(&msg, serialized);
197 assert_deserialize_eq(&msg, serialized);
198 }
199
200 #[test]
201 fn service_created_without_cookie() {
202 let serialized = [
203 71, 0, 0, 0, 44, 0, 2, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
204 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
205 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9, 0x9c,
206 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74, 0x6e,
207 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
208 ];
209
210 let msg = EmitBusEvent {
211 cookie: None,
212 event: BusEvent::ServiceCreated(ServiceId::new(
213 ObjectId::new(
214 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
215 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
216 ),
217 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
218 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
219 )),
220 };
221 assert_serialize_eq(&msg, serialized);
222 assert_deserialize_eq(&msg, serialized);
223
224 let msg = Message::EmitBusEvent(msg);
225 assert_serialize_eq(&msg, serialized);
226 assert_deserialize_eq(&msg, serialized);
227 }
228
229 #[test]
230 fn service_destroyed_without_cookie() {
231 let serialized = [
232 71, 0, 0, 0, 44, 0, 3, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc, 0x5e,
233 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49, 0x30,
234 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9, 0x9c,
235 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74, 0x6e,
236 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
237 ];
238
239 let msg = EmitBusEvent {
240 cookie: None,
241 event: BusEvent::ServiceDestroyed(ServiceId::new(
242 ObjectId::new(
243 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
244 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
245 ),
246 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
247 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
248 )),
249 };
250 assert_serialize_eq(&msg, serialized);
251 assert_deserialize_eq(&msg, serialized);
252
253 let msg = Message::EmitBusEvent(msg);
254 assert_serialize_eq(&msg, serialized);
255 assert_deserialize_eq(&msg, serialized);
256 }
257
258 #[test]
259 fn object_created_with_cookie() {
260 let serialized = [
261 55, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
262 0x99, 0xd0, 0xf4, 0x07, 0xb7, 0, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
263 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
264 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
265 ];
266
267 let msg = EmitBusEvent {
268 cookie: Some(BusListenerCookie(uuid!(
269 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
270 ))),
271 event: BusEvent::ObjectCreated(ObjectId::new(
272 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
273 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
274 )),
275 };
276 assert_serialize_eq(&msg, serialized);
277 assert_deserialize_eq(&msg, serialized);
278
279 let msg = Message::EmitBusEvent(msg);
280 assert_serialize_eq(&msg, serialized);
281 assert_deserialize_eq(&msg, serialized);
282 }
283
284 #[test]
285 fn object_destroyed_with_cookie() {
286 let serialized = [
287 55, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
288 0x99, 0xd0, 0xf4, 0x07, 0xb7, 1, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
289 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
290 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7,
291 ];
292
293 let msg = EmitBusEvent {
294 cookie: Some(BusListenerCookie(uuid!(
295 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
296 ))),
297 event: BusEvent::ObjectDestroyed(ObjectId::new(
298 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
299 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
300 )),
301 };
302 assert_serialize_eq(&msg, serialized);
303 assert_deserialize_eq(&msg, serialized);
304
305 let msg = Message::EmitBusEvent(msg);
306 assert_serialize_eq(&msg, serialized);
307 assert_deserialize_eq(&msg, serialized);
308 }
309
310 #[test]
311 fn service_created_with_cookie() {
312 let serialized = [
313 87, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
314 0x99, 0xd0, 0xf4, 0x07, 0xb7, 2, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
315 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
316 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9,
317 0x9c, 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74,
318 0x6e, 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
319 ];
320
321 let msg = EmitBusEvent {
322 cookie: Some(BusListenerCookie(uuid!(
323 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
324 ))),
325 event: BusEvent::ServiceCreated(ServiceId::new(
326 ObjectId::new(
327 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
328 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
329 ),
330 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
331 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
332 )),
333 };
334 assert_serialize_eq(&msg, serialized);
335 assert_deserialize_eq(&msg, serialized);
336
337 let msg = Message::EmitBusEvent(msg);
338 assert_serialize_eq(&msg, serialized);
339 assert_deserialize_eq(&msg, serialized);
340 }
341
342 #[test]
343 fn service_destroyed_with_cookie() {
344 let serialized = [
345 87, 0, 0, 0, 44, 1, 0xb6, 0x6c, 0x03, 0x07, 0x85, 0xcf, 0x4a, 0x7c, 0x8a, 0xcf, 0x6e,
346 0x99, 0xd0, 0xf4, 0x07, 0xb7, 3, 0x3f, 0x5e, 0xb6, 0x03, 0xce, 0x4b, 0x4c, 0x48, 0xbc,
347 0x5e, 0x90, 0x90, 0x7f, 0x55, 0xab, 0x8a, 0x03, 0xdb, 0xbf, 0xa4, 0x44, 0x76, 0x49,
348 0x30, 0xa4, 0xd7, 0x28, 0x32, 0x6e, 0xfd, 0x7f, 0xc7, 0xaf, 0xfc, 0xb7, 0x9b, 0xe9,
349 0x9c, 0x47, 0x84, 0x95, 0xe0, 0x0d, 0xc9, 0x9f, 0xcb, 0xa8, 0xff, 0x37, 0x22, 0x74,
350 0x6e, 0x76, 0xa8, 0x41, 0x31, 0x98, 0x32, 0x42, 0xc4, 0x78, 0x3f, 0x89, 0x97,
351 ];
352
353 let msg = EmitBusEvent {
354 cookie: Some(BusListenerCookie(uuid!(
355 "b66c0307-85cf-4a7c-8acf-6e99d0f407b7"
356 ))),
357 event: BusEvent::ServiceDestroyed(ServiceId::new(
358 ObjectId::new(
359 uuid!("3f5eb603-ce4b-4c48-bc5e-90907f55ab8a").into(),
360 uuid!("03dbbfa4-4476-4930-a4d7-28326efd7fc7").into(),
361 ),
362 uuid!("affcb79b-e99c-4784-95e0-0dc99fcba8ff").into(),
363 uuid!("3722746e-76a8-4131-9832-42c4783f8997").into(),
364 )),
365 };
366 assert_serialize_eq(&msg, serialized);
367 assert_deserialize_eq(&msg, serialized);
368
369 let msg = Message::EmitBusEvent(msg);
370 assert_serialize_eq(&msg, serialized);
371 assert_deserialize_eq(&msg, serialized);
372 }
373}
374
375#[derive(Debug, Copy, Clone, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
376#[repr(u8)]
377enum BusEventKind {
378 ObjectCreated = 0,
379 ObjectDestroyed = 1,
380 ServiceCreated = 2,
381 ServiceDestroyed = 3,
382}