aldrin_core/message/
claim_channel_end.rs

1use 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}