aldrin_core/message/
channel_end_closed.rs

1use super::message_ops::Sealed;
2use super::{Message, MessageKind, MessageOps};
3use crate::channel_end::ChannelEnd;
4use crate::ids::ChannelCookie;
5use crate::message_deserializer::{MessageDeserializeError, MessageWithoutValueDeserializer};
6use crate::message_serializer::{MessageSerializeError, MessageSerializer};
7use crate::serialized_value::SerializedValueSlice;
8use bytes::BytesMut;
9
10#[derive(Debug, Copy, Clone, PartialEq, Eq)]
11#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
12pub struct ChannelEndClosed {
13    pub cookie: ChannelCookie,
14    pub end: ChannelEnd,
15}
16
17impl MessageOps for ChannelEndClosed {
18    fn kind(&self) -> MessageKind {
19        MessageKind::ChannelEndClosed
20    }
21
22    fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
23        let mut serializer = MessageSerializer::without_value(MessageKind::ChannelEndClosed);
24
25        serializer.put_uuid(self.cookie.0);
26        serializer.put_discriminant_u8(self.end);
27
28        serializer.finish()
29    }
30
31    fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
32        let mut deserializer =
33            MessageWithoutValueDeserializer::new(buf, MessageKind::ChannelEndClosed)?;
34
35        let cookie = deserializer.try_get_uuid().map(ChannelCookie)?;
36        let end = deserializer.try_get_discriminant_u8()?;
37
38        deserializer.finish()?;
39        Ok(Self { cookie, end })
40    }
41
42    fn value(&self) -> Option<&SerializedValueSlice> {
43        None
44    }
45}
46
47impl Sealed for ChannelEndClosed {}
48
49impl From<ChannelEndClosed> for Message {
50    fn from(msg: ChannelEndClosed) -> Self {
51        Self::ChannelEndClosed(msg)
52    }
53}
54
55#[cfg(test)]
56mod test {
57    use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
58    use super::super::Message;
59    use super::ChannelEndClosed;
60    use crate::channel_end::ChannelEnd;
61    use crate::ids::ChannelCookie;
62    use uuid::uuid;
63
64    #[test]
65    fn sender() {
66        let serialized = [
67            22, 0, 0, 0, 23, 0x89, 0xe6, 0x24, 0x38, 0x29, 0x91, 0x48, 0xf8, 0xae, 0x1d, 0x7a,
68            0xd9, 0xdd, 0xcd, 0x7e, 0x72, 0,
69        ];
70
71        let msg = ChannelEndClosed {
72            cookie: ChannelCookie(uuid!("89e62438-2991-48f8-ae1d-7ad9ddcd7e72")),
73            end: ChannelEnd::Sender,
74        };
75        assert_serialize_eq(&msg, serialized);
76        assert_deserialize_eq(&msg, serialized);
77
78        let msg = Message::ChannelEndClosed(msg);
79        assert_serialize_eq(&msg, serialized);
80        assert_deserialize_eq(&msg, serialized);
81    }
82
83    #[test]
84    fn receiver() {
85        let serialized = [
86            22, 0, 0, 0, 23, 0x89, 0xe6, 0x24, 0x38, 0x29, 0x91, 0x48, 0xf8, 0xae, 0x1d, 0x7a,
87            0xd9, 0xdd, 0xcd, 0x7e, 0x72, 1,
88        ];
89
90        let msg = ChannelEndClosed {
91            cookie: ChannelCookie(uuid!("89e62438-2991-48f8-ae1d-7ad9ddcd7e72")),
92            end: ChannelEnd::Receiver,
93        };
94        assert_serialize_eq(&msg, serialized);
95        assert_deserialize_eq(&msg, serialized);
96
97        let msg = Message::ChannelEndClosed(msg);
98        assert_serialize_eq(&msg, serialized);
99        assert_deserialize_eq(&msg, serialized);
100    }
101}