aldrin_core/message/
create_object_reply.rs1use super::message_ops::Sealed;
2use super::{
3 Message, MessageDeserializeError, MessageKind, MessageOps, MessageSerializeError,
4 MessageSerializer, MessageWithoutValueDeserializer,
5};
6use crate::{ObjectCookie, SerializedValue, 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 fn value_mut(&mut self) -> Option<&mut SerializedValue> {
79 None
80 }
81}
82
83impl Sealed for CreateObjectReply {}
84
85impl From<CreateObjectReply> for Message {
86 fn from(msg: CreateObjectReply) -> Self {
87 Self::CreateObjectReply(msg)
88 }
89}
90
91#[cfg(test)]
92mod test {
93 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
94 use super::super::Message;
95 use super::{CreateObjectReply, CreateObjectResult};
96 use crate::ObjectCookie;
97 use uuid::uuid;
98
99 #[test]
100 fn ok() {
101 let serialized = [
102 23, 0, 0, 0, 4, 1, 0, 0xb7, 0xc3, 0xbe, 0x13, 0x53, 0x77, 0x46, 0x6e, 0xb4, 0xbf, 0x37,
103 0x38, 0x76, 0x52, 0x3d, 0x1b,
104 ];
105
106 let msg = CreateObjectReply {
107 serial: 1,
108 result: CreateObjectResult::Ok(ObjectCookie(uuid!(
109 "b7c3be13-5377-466e-b4bf-373876523d1b"
110 ))),
111 };
112 assert_serialize_eq(&msg, serialized);
113 assert_deserialize_eq(&msg, serialized);
114
115 let msg = Message::CreateObjectReply(msg);
116 assert_serialize_eq(&msg, serialized);
117 assert_deserialize_eq(&msg, serialized);
118 }
119
120 #[test]
121 fn duplicate_object() {
122 let serialized = [7, 0, 0, 0, 4, 1, 1];
123
124 let msg = CreateObjectReply {
125 serial: 1,
126 result: CreateObjectResult::DuplicateObject,
127 };
128 assert_serialize_eq(&msg, serialized);
129 assert_deserialize_eq(&msg, serialized);
130
131 let msg = Message::CreateObjectReply(msg);
132 assert_serialize_eq(&msg, serialized);
133 assert_deserialize_eq(&msg, serialized);
134 }
135}