aldrin_core/message/
destroy_object_reply.rs

1use 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}