aldrin_core/message/
destroy_object_reply.rs1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps};
3use crate::message_deserializer::{MessageDeserializeError, MessageWithoutValueDeserializer};
4use crate::message_serializer::{MessageSerializeError, MessageSerializer};
5use crate::serialized_value::SerializedValueSlice;
6use bytes::BytesMut;
7use num_enum::{IntoPrimitive, TryFromPrimitive};
8
9#[derive(Debug, Copy, Clone, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
10#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
11#[repr(u8)]
12pub enum DestroyObjectResult {
13 Ok = 0,
14 InvalidObject = 1,
15 ForeignObject = 2,
16}
17
18#[derive(Debug, Copy, Clone, PartialEq, Eq)]
19#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
20pub struct DestroyObjectReply {
21 pub serial: u32,
22 pub result: DestroyObjectResult,
23}
24
25impl MessageOps for DestroyObjectReply {
26 fn kind(&self) -> MessageKind {
27 MessageKind::DestroyObjectReply
28 }
29
30 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
31 let mut serializer = MessageSerializer::without_value(MessageKind::DestroyObjectReply);
32
33 serializer.put_varint_u32_le(self.serial);
34 serializer.put_discriminant_u8(self.result);
35
36 serializer.finish()
37 }
38
39 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
40 let mut deserializer =
41 MessageWithoutValueDeserializer::new(buf, MessageKind::DestroyObjectReply)?;
42
43 let serial = deserializer.try_get_varint_u32_le()?;
44 let result = deserializer.try_get_discriminant_u8()?;
45
46 deserializer.finish()?;
47 Ok(Self { serial, result })
48 }
49
50 fn value(&self) -> Option<&SerializedValueSlice> {
51 None
52 }
53}
54
55impl Sealed for DestroyObjectReply {}
56
57impl From<DestroyObjectReply> for Message {
58 fn from(msg: DestroyObjectReply) -> Self {
59 Self::DestroyObjectReply(msg)
60 }
61}
62
63#[cfg(test)]
64mod test {
65 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
66 use super::super::Message;
67 use super::{DestroyObjectReply, DestroyObjectResult};
68
69 #[test]
70 fn ok() {
71 let serialized = [7, 0, 0, 0, 6, 1, 0];
72
73 let msg = DestroyObjectReply {
74 serial: 1,
75 result: DestroyObjectResult::Ok,
76 };
77 assert_serialize_eq(&msg, serialized);
78 assert_deserialize_eq(&msg, serialized);
79
80 let msg = Message::DestroyObjectReply(msg);
81 assert_serialize_eq(&msg, serialized);
82 assert_deserialize_eq(&msg, serialized);
83 }
84
85 #[test]
86 fn invalid_object() {
87 let serialized = [7, 0, 0, 0, 6, 1, 1];
88
89 let msg = DestroyObjectReply {
90 serial: 1,
91 result: DestroyObjectResult::InvalidObject,
92 };
93 assert_serialize_eq(&msg, serialized);
94 assert_deserialize_eq(&msg, serialized);
95
96 let msg = Message::DestroyObjectReply(msg);
97 assert_serialize_eq(&msg, serialized);
98 assert_deserialize_eq(&msg, serialized);
99 }
100
101 #[test]
102 fn foreign_object() {
103 let serialized = [7, 0, 0, 0, 6, 1, 2];
104
105 let msg = DestroyObjectReply {
106 serial: 1,
107 result: DestroyObjectResult::ForeignObject,
108 };
109 assert_serialize_eq(&msg, serialized);
110 assert_deserialize_eq(&msg, serialized);
111
112 let msg = Message::DestroyObjectReply(msg);
113 assert_serialize_eq(&msg, serialized);
114 assert_deserialize_eq(&msg, serialized);
115 }
116}