aldrin_core/message/
create_service2.rs

1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps};
3use crate::error::{DeserializeError, SerializeError};
4use crate::ids::{ObjectCookie, ServiceUuid};
5use crate::message_deserializer::{MessageDeserializeError, MessageWithValueDeserializer};
6use crate::message_serializer::{MessageSerializeError, MessageSerializer};
7use crate::serialized_value::{SerializedValue, SerializedValueSlice};
8use crate::service_info::ServiceInfo;
9use bytes::BytesMut;
10
11#[derive(Debug, Clone, PartialEq, Eq)]
12#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
13pub struct CreateService2 {
14    pub serial: u32,
15    pub object_cookie: ObjectCookie,
16    pub uuid: ServiceUuid,
17    pub value: SerializedValue,
18}
19
20impl CreateService2 {
21    pub fn with_serialize_info(
22        serial: u32,
23        object_cookie: ObjectCookie,
24        uuid: ServiceUuid,
25        info: ServiceInfo,
26    ) -> Result<Self, SerializeError> {
27        let value = SerializedValue::serialize(&info)?;
28
29        Ok(Self {
30            serial,
31            object_cookie,
32            uuid,
33            value,
34        })
35    }
36
37    pub fn deserialize_info(&self) -> Result<ServiceInfo, DeserializeError> {
38        self.value.deserialize()
39    }
40}
41
42impl MessageOps for CreateService2 {
43    fn kind(&self) -> MessageKind {
44        MessageKind::CreateService2
45    }
46
47    fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
48        let mut serializer =
49            MessageSerializer::with_value(self.value, MessageKind::CreateService2)?;
50
51        serializer.put_varint_u32_le(self.serial);
52        serializer.put_uuid(self.object_cookie.0);
53        serializer.put_uuid(self.uuid.0);
54
55        serializer.finish()
56    }
57
58    fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
59        let mut deserializer = MessageWithValueDeserializer::new(buf, MessageKind::CreateService2)?;
60
61        let serial = deserializer.try_get_varint_u32_le()?;
62        let object_cookie = deserializer.try_get_uuid().map(ObjectCookie)?;
63        let uuid = deserializer.try_get_uuid().map(ServiceUuid)?;
64        let value = deserializer.finish()?;
65
66        Ok(Self {
67            serial,
68            object_cookie,
69            uuid,
70            value,
71        })
72    }
73
74    fn value(&self) -> Option<&SerializedValueSlice> {
75        Some(&self.value)
76    }
77}
78
79impl Sealed for CreateService2 {}
80
81impl From<CreateService2> for Message {
82    fn from(msg: CreateService2) -> Self {
83        Self::CreateService2(msg)
84    }
85}
86
87#[cfg(test)]
88mod test {
89    use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
90    use super::super::Message;
91    use super::CreateService2;
92    use crate::ids::{ObjectCookie, ServiceUuid};
93    use crate::service_info::ServiceInfo;
94    use uuid::uuid;
95
96    #[test]
97    fn create_service2() {
98        let serialized = [
99            51, 0, 0, 0, 52, 9, 0, 0, 0, 39, 3, 0, 7, 2, 1, 0, 2, 0, 1, 0xb7, 0xc3, 0xbe, 0x13,
100            0x53, 0x77, 0x46, 0x6e, 0xb4, 0xbf, 0x37, 0x38, 0x76, 0x52, 0x3d, 0x1b, 0xd3, 0xef,
101            0xd0, 0x0b, 0x7a, 0x7b, 0x4b, 0xf7, 0xbd, 0xd3, 0x3c, 0x66, 0x32, 0x47, 0x33, 0x47,
102        ];
103
104        let msg = CreateService2::with_serialize_info(
105            1,
106            ObjectCookie(uuid!("b7c3be13-5377-466e-b4bf-373876523d1b")),
107            ServiceUuid(uuid!("d3efd00b-7a7b-4bf7-bdd3-3c6632473347")),
108            ServiceInfo::new(2),
109        )
110        .unwrap();
111
112        assert_serialize_eq(&msg, serialized);
113        assert_deserialize_eq(&msg, serialized);
114
115        let msg = Message::CreateService2(msg);
116        assert_serialize_eq(&msg, serialized);
117        assert_deserialize_eq(&msg, serialized);
118    }
119}