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}