aldrin_core/message/
create_channel.rs1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps};
3use crate::channel_end::{ChannelEnd, ChannelEndWithCapacity};
4use crate::message_deserializer::{MessageDeserializeError, MessageWithoutValueDeserializer};
5use crate::message_serializer::{MessageSerializeError, MessageSerializer};
6use crate::serialized_value::SerializedValueSlice;
7use bytes::BytesMut;
8
9#[derive(Debug, Copy, Clone, PartialEq, Eq)]
10#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
11pub struct CreateChannel {
12 pub serial: u32,
13 pub end: ChannelEndWithCapacity,
14}
15
16impl MessageOps for CreateChannel {
17 fn kind(&self) -> MessageKind {
18 MessageKind::CreateChannel
19 }
20
21 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
22 let mut serializer = MessageSerializer::without_value(MessageKind::CreateChannel);
23
24 serializer.put_varint_u32_le(self.serial);
25
26 match self.end {
27 ChannelEndWithCapacity::Sender => serializer.put_discriminant_u8(ChannelEnd::Sender),
28 ChannelEndWithCapacity::Receiver(capacity) => {
29 serializer.put_discriminant_u8(ChannelEnd::Receiver);
30 serializer.put_varint_u32_le(capacity);
31 }
32 }
33
34 serializer.finish()
35 }
36
37 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
38 let mut deserializer =
39 MessageWithoutValueDeserializer::new(buf, MessageKind::CreateChannel)?;
40
41 let serial = deserializer.try_get_varint_u32_le()?;
42
43 let end = match deserializer.try_get_discriminant_u8()? {
44 ChannelEnd::Sender => ChannelEndWithCapacity::Sender,
45 ChannelEnd::Receiver => {
46 let capacity = deserializer.try_get_varint_u32_le()?;
47 ChannelEndWithCapacity::Receiver(capacity)
48 }
49 };
50
51 deserializer.finish()?;
52 Ok(Self { serial, end })
53 }
54
55 fn value(&self) -> Option<&SerializedValueSlice> {
56 None
57 }
58}
59
60impl Sealed for CreateChannel {}
61
62impl From<CreateChannel> for Message {
63 fn from(msg: CreateChannel) -> Self {
64 Self::CreateChannel(msg)
65 }
66}
67
68#[cfg(test)]
69mod test {
70 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
71 use super::super::Message;
72 use super::CreateChannel;
73 use crate::channel_end::ChannelEndWithCapacity;
74
75 #[test]
76 fn sender() {
77 let serialized = [7, 0, 0, 0, 19, 1, 0];
78
79 let msg = CreateChannel {
80 serial: 1,
81 end: ChannelEndWithCapacity::Sender,
82 };
83 assert_serialize_eq(&msg, serialized);
84 assert_deserialize_eq(&msg, serialized);
85
86 let msg = Message::CreateChannel(msg);
87 assert_serialize_eq(&msg, serialized);
88 assert_deserialize_eq(&msg, serialized);
89 }
90
91 #[test]
92 fn receiver() {
93 let serialized = [8, 0, 0, 0, 19, 1, 1, 16];
94
95 let msg = CreateChannel {
96 serial: 1,
97 end: ChannelEndWithCapacity::Receiver(16),
98 };
99 assert_serialize_eq(&msg, serialized);
100 assert_deserialize_eq(&msg, serialized);
101
102 let msg = Message::CreateChannel(msg);
103 assert_serialize_eq(&msg, serialized);
104 assert_deserialize_eq(&msg, serialized);
105 }
106}