aldrin_core/message/
close_channel_end.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 CloseChannelEnd {
13    pub serial: u32,
14    pub cookie: ChannelCookie,
15    pub end: ChannelEnd,
16}
17
18impl MessageOps for CloseChannelEnd {
19    fn kind(&self) -> MessageKind {
20        MessageKind::CloseChannelEnd
21    }
22
23    fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
24        let mut serializer = MessageSerializer::without_value(MessageKind::CloseChannelEnd);
25
26        serializer.put_varint_u32_le(self.serial);
27        serializer.put_uuid(self.cookie.0);
28        serializer.put_discriminant_u8(self.end);
29
30        serializer.finish()
31    }
32
33    fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
34        let mut deserializer =
35            MessageWithoutValueDeserializer::new(buf, MessageKind::CloseChannelEnd)?;
36
37        let serial = deserializer.try_get_varint_u32_le()?;
38        let cookie = deserializer.try_get_uuid().map(ChannelCookie)?;
39        let end = deserializer.try_get_discriminant_u8()?;
40
41        deserializer.finish()?;
42        Ok(Self {
43            serial,
44            cookie,
45            end,
46        })
47    }
48
49    fn value(&self) -> Option<&SerializedValueSlice> {
50        None
51    }
52}
53
54impl Sealed for CloseChannelEnd {}
55
56impl From<CloseChannelEnd> for Message {
57    fn from(msg: CloseChannelEnd) -> Self {
58        Self::CloseChannelEnd(msg)
59    }
60}
61
62#[cfg(test)]
63mod test {
64    use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
65    use super::super::Message;
66    use super::CloseChannelEnd;
67    use crate::channel_end::ChannelEnd;
68    use crate::ids::ChannelCookie;
69    use uuid::uuid;
70
71    #[test]
72    fn sender() {
73        let serialized = [
74            23, 0, 0, 0, 21, 1, 0xde, 0xcf, 0x4b, 0x2f, 0x56, 0x2c, 0x4c, 0x1b, 0xb8, 0x84, 0x61,
75            0x47, 0xe3, 0xde, 0x76, 0xc0, 0,
76        ];
77
78        let msg = CloseChannelEnd {
79            serial: 1,
80            cookie: ChannelCookie(uuid!("decf4b2f-562c-4c1b-b884-6147e3de76c0")),
81            end: ChannelEnd::Sender,
82        };
83        assert_serialize_eq(&msg, serialized);
84        assert_deserialize_eq(&msg, serialized);
85
86        let msg = Message::CloseChannelEnd(msg);
87        assert_serialize_eq(&msg, serialized);
88        assert_deserialize_eq(&msg, serialized);
89    }
90
91    #[test]
92    fn receiver() {
93        let serialized = [
94            23, 0, 0, 0, 21, 1, 0xde, 0xcf, 0x4b, 0x2f, 0x56, 0x2c, 0x4c, 0x1b, 0xb8, 0x84, 0x61,
95            0x47, 0xe3, 0xde, 0x76, 0xc0, 1,
96        ];
97
98        let msg = CloseChannelEnd {
99            serial: 1,
100            cookie: ChannelCookie(uuid!("decf4b2f-562c-4c1b-b884-6147e3de76c0")),
101            end: ChannelEnd::Receiver,
102        };
103        assert_serialize_eq(&msg, serialized);
104        assert_deserialize_eq(&msg, serialized);
105
106        let msg = Message::CloseChannelEnd(msg);
107        assert_serialize_eq(&msg, serialized);
108        assert_deserialize_eq(&msg, serialized);
109    }
110}