aldrin_core/message/
connect.rs1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps};
3use crate::error::SerializeError;
4use crate::message_deserializer::{MessageDeserializeError, MessageWithValueDeserializer};
5use crate::message_serializer::{MessageSerializeError, MessageSerializer};
6use crate::serialized_value::{SerializedValue, SerializedValueSlice};
7use crate::value_serializer::Serialize;
8use bytes::BytesMut;
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
12pub struct Connect {
13 pub version: u32,
14 pub value: SerializedValue,
15}
16
17impl Connect {
18 pub fn with_serialize_value<T: Serialize + ?Sized>(
19 version: u32,
20 value: &T,
21 ) -> Result<Self, SerializeError> {
22 let value = SerializedValue::serialize(value)?;
23 Ok(Self { version, value })
24 }
25}
26
27impl MessageOps for Connect {
28 fn kind(&self) -> MessageKind {
29 MessageKind::Connect
30 }
31
32 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
33 let mut serializer = MessageSerializer::with_value(self.value, MessageKind::Connect)?;
34
35 serializer.put_varint_u32_le(self.version);
36
37 serializer.finish()
38 }
39
40 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
41 let mut deserializer = MessageWithValueDeserializer::new(buf, MessageKind::Connect)?;
42
43 let version = deserializer.try_get_varint_u32_le()?;
44 let value = deserializer.finish()?;
45
46 Ok(Self { version, value })
47 }
48
49 fn value(&self) -> Option<&SerializedValueSlice> {
50 Some(&self.value)
51 }
52}
53
54impl Sealed for Connect {}
55
56impl From<Connect> for Message {
57 fn from(msg: Connect) -> Self {
58 Self::Connect(msg)
59 }
60}
61
62#[cfg(test)]
63mod test {
64 use super::super::test::{assert_deserialize_eq_with_value, assert_serialize_eq};
65 use super::super::Message;
66 use super::Connect;
67
68 #[test]
69 fn connect() {
70 let serialized = [12, 0, 0, 0, 0, 2, 0, 0, 0, 3, 4, 1];
71 let value = 4u8;
72
73 let msg = Connect::with_serialize_value(1, &value).unwrap();
74 assert_serialize_eq(&msg, serialized);
75 assert_deserialize_eq_with_value(&msg, serialized, &value);
76
77 let msg = Message::Connect(msg);
78 assert_serialize_eq(&msg, serialized);
79 assert_deserialize_eq_with_value(&msg, serialized, &value);
80 }
81}