aldrin_core/message/
destroy_service_reply.rs

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