aldrin_core/message/
emit_bus_event.rs

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