aldrin_core/message/
emit_bus_event.rs

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}