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