aldrin_core/message/
register_introspection.rs

1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps};
3use crate::error::{DeserializeError, SerializeError};
4use crate::ids::TypeId;
5use crate::message_deserializer::{MessageDeserializeError, MessageWithValueDeserializer};
6use crate::message_serializer::{MessageSerializeError, MessageSerializer};
7use crate::serialized_value::{SerializedValue, SerializedValueSlice};
8use bytes::BytesMut;
9use std::collections::HashSet;
10
11#[derive(Debug, Clone, PartialEq, Eq)]
12#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
13pub struct RegisterIntrospection {
14    pub value: SerializedValue,
15}
16
17impl RegisterIntrospection {
18    pub fn with_serialize_type_ids(type_ids: &HashSet<TypeId>) -> Result<Self, SerializeError> {
19        let value = SerializedValue::serialize(type_ids)?;
20        Ok(Self { value })
21    }
22
23    pub fn deserialize_type_ids(&self) -> Result<HashSet<TypeId>, DeserializeError> {
24        self.value.deserialize()
25    }
26}
27
28impl MessageOps for RegisterIntrospection {
29    fn kind(&self) -> MessageKind {
30        MessageKind::RegisterIntrospection
31    }
32
33    fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
34        MessageSerializer::with_value(self.value, MessageKind::RegisterIntrospection)?.finish()
35    }
36
37    fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
38        let value =
39            MessageWithValueDeserializer::new(buf, MessageKind::RegisterIntrospection)?.finish()?;
40
41        Ok(Self { value })
42    }
43
44    fn value(&self) -> Option<&SerializedValueSlice> {
45        Some(&self.value)
46    }
47}
48
49impl Sealed for RegisterIntrospection {}
50
51impl From<RegisterIntrospection> for Message {
52    fn from(msg: RegisterIntrospection) -> Self {
53        Self::RegisterIntrospection(msg)
54    }
55}
56
57#[cfg(test)]
58mod test {
59    use super::super::test::assert_serialize_eq;
60    use super::super::Message;
61    use super::RegisterIntrospection;
62    use crate::ids::TypeId;
63    use uuid::uuid;
64
65    #[test]
66    fn emit_event() {
67        let serialized = [
68            27, 0, 0, 0, 49, 18, 0, 0, 0, 38, 1, 0x02, 0x6c, 0x31, 0x42, 0x53, 0x0b, 0x4d, 0x65,
69            0x85, 0x0d, 0xa2, 0x97, 0xdc, 0xc2, 0xfe, 0xcb,
70        ];
71        let ids = Some(TypeId(uuid!("026c3142-530b-4d65-850d-a297dcc2fecb")))
72            .into_iter()
73            .collect();
74
75        let msg = RegisterIntrospection::with_serialize_type_ids(&ids).unwrap();
76        assert_serialize_eq(&msg, serialized);
77        assert_eq!(ids, msg.deserialize_type_ids().unwrap());
78
79        let msg = Message::RegisterIntrospection(msg);
80        assert_serialize_eq(&msg, serialized);
81    }
82}