aldrin_core/message/
claim_channel_end.rs

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}