aldrin_core/message/
query_service_version_reply.rs

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