aldrin_core/message/
destroy_service_reply.rs1use 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}