aldrin_core/message/
create_object_reply.rs1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps};
3use crate::ids::ObjectCookie;
4use crate::message_deserializer::{MessageDeserializeError, MessageWithoutValueDeserializer};
5use crate::message_serializer::{MessageSerializeError, MessageSerializer};
6use crate::serialized_value::SerializedValueSlice;
7use bytes::BytesMut;
8use num_enum::{IntoPrimitive, TryFromPrimitive};
9
10#[derive(Debug, Copy, Clone, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
11#[repr(u8)]
12enum CreateObjectReplyKind {
13 Ok = 0,
14 DuplicateObject = 1,
15}
16
17#[derive(Debug, Copy, Clone, PartialEq, Eq)]
18#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
19pub enum CreateObjectResult {
20 Ok(ObjectCookie),
21 DuplicateObject,
22}
23
24#[derive(Debug, Copy, Clone, PartialEq, Eq)]
25#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
26pub struct CreateObjectReply {
27 pub serial: u32,
28 pub result: CreateObjectResult,
29}
30
31impl MessageOps for CreateObjectReply {
32 fn kind(&self) -> MessageKind {
33 MessageKind::CreateObjectReply
34 }
35
36 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
37 let mut serializer = MessageSerializer::without_value(MessageKind::CreateObjectReply);
38
39 serializer.put_varint_u32_le(self.serial);
40
41 match self.result {
42 CreateObjectResult::Ok(cookie) => {
43 serializer.put_discriminant_u8(CreateObjectReplyKind::Ok);
44 serializer.put_uuid(cookie.0);
45 }
46
47 CreateObjectResult::DuplicateObject => {
48 serializer.put_discriminant_u8(CreateObjectReplyKind::DuplicateObject);
49 }
50 }
51
52 serializer.finish()
53 }
54
55 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
56 let mut deserializer =
57 MessageWithoutValueDeserializer::new(buf, MessageKind::CreateObjectReply)?;
58
59 let serial = deserializer.try_get_varint_u32_le()?;
60
61 let result = match deserializer.try_get_discriminant_u8()? {
62 CreateObjectReplyKind::Ok => {
63 let cookie = deserializer.try_get_uuid().map(ObjectCookie)?;
64 CreateObjectResult::Ok(cookie)
65 }
66
67 CreateObjectReplyKind::DuplicateObject => CreateObjectResult::DuplicateObject,
68 };
69
70 deserializer.finish()?;
71 Ok(Self { serial, result })
72 }
73
74 fn value(&self) -> Option<&SerializedValueSlice> {
75 None
76 }
77}
78
79impl Sealed for CreateObjectReply {}
80
81impl From<CreateObjectReply> for Message {
82 fn from(msg: CreateObjectReply) -> Self {
83 Self::CreateObjectReply(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::{CreateObjectReply, CreateObjectResult};
92 use crate::ids::ObjectCookie;
93 use uuid::uuid;
94
95 #[test]
96 fn ok() {
97 let serialized = [
98 23, 0, 0, 0, 4, 1, 0, 0xb7, 0xc3, 0xbe, 0x13, 0x53, 0x77, 0x46, 0x6e, 0xb4, 0xbf, 0x37,
99 0x38, 0x76, 0x52, 0x3d, 0x1b,
100 ];
101
102 let msg = CreateObjectReply {
103 serial: 1,
104 result: CreateObjectResult::Ok(ObjectCookie(uuid!(
105 "b7c3be13-5377-466e-b4bf-373876523d1b"
106 ))),
107 };
108 assert_serialize_eq(&msg, serialized);
109 assert_deserialize_eq(&msg, serialized);
110
111 let msg = Message::CreateObjectReply(msg);
112 assert_serialize_eq(&msg, serialized);
113 assert_deserialize_eq(&msg, serialized);
114 }
115
116 #[test]
117 fn duplicate_object() {
118 let serialized = [7, 0, 0, 0, 4, 1, 1];
119
120 let msg = CreateObjectReply {
121 serial: 1,
122 result: CreateObjectResult::DuplicateObject,
123 };
124 assert_serialize_eq(&msg, serialized);
125 assert_deserialize_eq(&msg, serialized);
126
127 let msg = Message::CreateObjectReply(msg);
128 assert_serialize_eq(&msg, serialized);
129 assert_deserialize_eq(&msg, serialized);
130 }
131}