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