aldrin_core/message/
subscribe_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 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}