aldrin_core/message/
query_service_version_reply.rs1use 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}