aldrin_core/message/
connect.rs

1use 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}