aldrin_core/message/
subscribe_event_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 SubscribeEventResult {
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 SubscribeEventReply {
20    pub serial: u32,
21    pub result: SubscribeEventResult,
22}
23
24impl MessageOps for SubscribeEventReply {
25    fn kind(&self) -> MessageKind {
26        MessageKind::SubscribeEventReply
27    }
28
29    fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
30        let mut serializer = MessageSerializer::without_value(MessageKind::SubscribeEventReply);
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::SubscribeEventReply)?;
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 SubscribeEventReply {}
55
56impl From<SubscribeEventReply> for Message {
57    fn from(msg: SubscribeEventReply) -> Self {
58        Self::SubscribeEventReply(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::{SubscribeEventReply, SubscribeEventResult};
67
68    #[test]
69    fn ok() {
70        let serialized = [7, 0, 0, 0, 14, 1, 0];
71
72        let msg = SubscribeEventReply {
73            serial: 1,
74            result: SubscribeEventResult::Ok,
75        };
76        assert_serialize_eq(&msg, serialized);
77        assert_deserialize_eq(&msg, serialized);
78
79        let msg = Message::SubscribeEventReply(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, 14, 1, 1];
87
88        let msg = SubscribeEventReply {
89            serial: 1,
90            result: SubscribeEventResult::InvalidService,
91        };
92        assert_serialize_eq(&msg, serialized);
93        assert_deserialize_eq(&msg, serialized);
94
95        let msg = Message::SubscribeEventReply(msg);
96        assert_serialize_eq(&msg, serialized);
97        assert_deserialize_eq(&msg, serialized);
98    }
99}