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