aldrin_core/message/
subscribe_service_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 SubscribeServiceResult {
13 Ok = 0,
14 InvalidService = 1,
15}
16
17#[derive(Debug, Copy, Clone, PartialEq, Eq)]
18#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
19pub struct SubscribeServiceReply {
20 pub serial: u32,
21 pub result: SubscribeServiceResult,
22}
23
24impl MessageOps for SubscribeServiceReply {
25 fn kind(&self) -> MessageKind {
26 MessageKind::SubscribeServiceReply
27 }
28
29 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
30 let mut serializer = MessageSerializer::without_value(MessageKind::SubscribeServiceReply);
31
32 serializer.put_varint_u32_le(self.serial);
33 serializer.put_discriminant_u8(self.result);
34
35 serializer.finish()
36 }
37
38 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
39 let mut deserializer =
40 MessageWithoutValueDeserializer::new(buf, MessageKind::SubscribeServiceReply)?;
41
42 let serial = deserializer.try_get_varint_u32_le()?;
43 let result = deserializer.try_get_discriminant_u8()?;
44
45 deserializer.finish()?;
46 Ok(Self { serial, result })
47 }
48
49 fn value(&self) -> Option<&SerializedValueSlice> {
50 None
51 }
52}
53
54impl Sealed for SubscribeServiceReply {}
55
56impl From<SubscribeServiceReply> for Message {
57 fn from(msg: SubscribeServiceReply) -> Self {
58 Self::SubscribeServiceReply(msg)
59 }
60}
61
62#[cfg(test)]
63mod test {
64 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
65 use super::super::Message;
66 use super::{SubscribeServiceReply, SubscribeServiceResult};
67
68 #[test]
69 fn ok() {
70 let serialized = [7, 0, 0, 0, 56, 1, 0];
71
72 let msg = SubscribeServiceReply {
73 serial: 1,
74 result: SubscribeServiceResult::Ok,
75 };
76 assert_serialize_eq(&msg, serialized);
77 assert_deserialize_eq(&msg, serialized);
78
79 let msg = Message::SubscribeServiceReply(msg);
80 assert_serialize_eq(&msg, serialized);
81 assert_deserialize_eq(&msg, serialized);
82 }
83
84 #[test]
85 fn invalid_service() {
86 let serialized = [7, 0, 0, 0, 56, 1, 1];
87
88 let msg = SubscribeServiceReply {
89 serial: 1,
90 result: SubscribeServiceResult::InvalidService,
91 };
92 assert_serialize_eq(&msg, serialized);
93 assert_deserialize_eq(&msg, serialized);
94
95 let msg = Message::SubscribeServiceReply(msg);
96 assert_serialize_eq(&msg, serialized);
97 assert_deserialize_eq(&msg, serialized);
98 }
99}