aldrin_core/message/
subscribe_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 SubscribeServiceResult {
14 Ok = 0,
15 InvalidService = 1,
16}
17
18#[derive(Debug, Copy, Clone, PartialEq, Eq)]
19#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
20pub struct SubscribeServiceReply {
21 pub serial: u32,
22 pub result: SubscribeServiceResult,
23}
24
25impl MessageOps for SubscribeServiceReply {
26 fn kind(&self) -> MessageKind {
27 MessageKind::SubscribeServiceReply
28 }
29
30 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
31 let mut serializer = MessageSerializer::without_value(MessageKind::SubscribeServiceReply);
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::SubscribeServiceReply)?;
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 fn value_mut(&mut self) -> Option<&mut SerializedValue> {
55 None
56 }
57}
58
59impl Sealed for SubscribeServiceReply {}
60
61impl From<SubscribeServiceReply> for Message {
62 fn from(msg: SubscribeServiceReply) -> Self {
63 Self::SubscribeServiceReply(msg)
64 }
65}
66
67#[cfg(test)]
68mod test {
69 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
70 use super::super::Message;
71 use super::{SubscribeServiceReply, SubscribeServiceResult};
72
73 #[test]
74 fn ok() {
75 let serialized = [7, 0, 0, 0, 56, 1, 0];
76
77 let msg = SubscribeServiceReply {
78 serial: 1,
79 result: SubscribeServiceResult::Ok,
80 };
81 assert_serialize_eq(&msg, serialized);
82 assert_deserialize_eq(&msg, serialized);
83
84 let msg = Message::SubscribeServiceReply(msg);
85 assert_serialize_eq(&msg, serialized);
86 assert_deserialize_eq(&msg, serialized);
87 }
88
89 #[test]
90 fn invalid_service() {
91 let serialized = [7, 0, 0, 0, 56, 1, 1];
92
93 let msg = SubscribeServiceReply {
94 serial: 1,
95 result: SubscribeServiceResult::InvalidService,
96 };
97 assert_serialize_eq(&msg, serialized);
98 assert_deserialize_eq(&msg, serialized);
99
100 let msg = Message::SubscribeServiceReply(msg);
101 assert_serialize_eq(&msg, serialized);
102 assert_deserialize_eq(&msg, serialized);
103 }
104}