aldrin_core/message/
close_channel_end.rs1use 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}