aldrin_core/message/
query_service_version_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#[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}