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