1use super::message_ops::Sealed;
2use super::{
3 Message, MessageDeserializeError, MessageKind, MessageOps, MessageSerializeError,
4 MessageSerializer, MessageWithoutValueDeserializer,
5};
6use crate::{SerializedValue, SerializedValueSlice};
7use bytes::BytesMut;
8use num_enum::{IntoPrimitive, TryFromPrimitive};
9
10#[derive(Debug, Copy, Clone, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
11#[repr(u8)]
12enum ClaimChannelEndReplyKind {
13 SenderClaimed = 0,
14 ReceiverClaimed = 1,
15 InvalidChannel = 2,
16 AlreadyClaimed = 3,
17}
18
19#[derive(Debug, Copy, Clone, PartialEq, Eq)]
20#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
21pub enum ClaimChannelEndResult {
22 SenderClaimed(u32),
23 ReceiverClaimed,
24 InvalidChannel,
25 AlreadyClaimed,
26}
27
28#[derive(Debug, Copy, Clone, PartialEq, Eq)]
29#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
30pub struct ClaimChannelEndReply {
31 pub serial: u32,
32 pub result: ClaimChannelEndResult,
33}
34
35impl MessageOps for ClaimChannelEndReply {
36 fn kind(&self) -> MessageKind {
37 MessageKind::ClaimChannelEndReply
38 }
39
40 fn serialize_message(self) -> Result<BytesMut, MessageSerializeError> {
41 let mut serializer = MessageSerializer::without_value(MessageKind::ClaimChannelEndReply);
42
43 serializer.put_varint_u32_le(self.serial);
44
45 match self.result {
46 ClaimChannelEndResult::SenderClaimed(capacity) => {
47 serializer.put_discriminant_u8(ClaimChannelEndReplyKind::SenderClaimed);
48 serializer.put_varint_u32_le(capacity);
49 }
50 ClaimChannelEndResult::ReceiverClaimed => {
51 serializer.put_discriminant_u8(ClaimChannelEndReplyKind::ReceiverClaimed)
52 }
53 ClaimChannelEndResult::InvalidChannel => {
54 serializer.put_discriminant_u8(ClaimChannelEndReplyKind::InvalidChannel)
55 }
56 ClaimChannelEndResult::AlreadyClaimed => {
57 serializer.put_discriminant_u8(ClaimChannelEndReplyKind::AlreadyClaimed)
58 }
59 }
60
61 serializer.finish()
62 }
63
64 fn deserialize_message(buf: BytesMut) -> Result<Self, MessageDeserializeError> {
65 let mut deserializer =
66 MessageWithoutValueDeserializer::new(buf, MessageKind::ClaimChannelEndReply)?;
67
68 let serial = deserializer.try_get_varint_u32_le()?;
69
70 let result = match deserializer.try_get_discriminant_u8()? {
71 ClaimChannelEndReplyKind::SenderClaimed => {
72 let capacity = deserializer.try_get_varint_u32_le()?;
73 ClaimChannelEndResult::SenderClaimed(capacity)
74 }
75 ClaimChannelEndReplyKind::ReceiverClaimed => ClaimChannelEndResult::ReceiverClaimed,
76 ClaimChannelEndReplyKind::InvalidChannel => ClaimChannelEndResult::InvalidChannel,
77 ClaimChannelEndReplyKind::AlreadyClaimed => ClaimChannelEndResult::AlreadyClaimed,
78 };
79
80 deserializer.finish()?;
81 Ok(Self { serial, result })
82 }
83
84 fn value(&self) -> Option<&SerializedValueSlice> {
85 None
86 }
87
88 fn value_mut(&mut self) -> Option<&mut SerializedValue> {
89 None
90 }
91}
92
93impl Sealed for ClaimChannelEndReply {}
94
95impl From<ClaimChannelEndReply> for Message {
96 fn from(msg: ClaimChannelEndReply) -> Self {
97 Self::ClaimChannelEndReply(msg)
98 }
99}
100
101#[cfg(test)]
102mod test {
103 use super::super::test::{assert_deserialize_eq, assert_serialize_eq};
104 use super::super::Message;
105 use super::{ClaimChannelEndReply, ClaimChannelEndResult};
106
107 #[test]
108 fn sender_claimed() {
109 let serialized = [8, 0, 0, 0, 25, 1, 0, 2];
110
111 let msg = ClaimChannelEndReply {
112 serial: 1,
113 result: ClaimChannelEndResult::SenderClaimed(2),
114 };
115 assert_serialize_eq(&msg, serialized);
116 assert_deserialize_eq(&msg, serialized);
117
118 let msg = Message::ClaimChannelEndReply(msg);
119 assert_serialize_eq(&msg, serialized);
120 assert_deserialize_eq(&msg, serialized);
121 }
122
123 #[test]
124 fn receiver_claimed() {
125 let serialized = [7, 0, 0, 0, 25, 1, 1];
126
127 let msg = ClaimChannelEndReply {
128 serial: 1,
129 result: ClaimChannelEndResult::ReceiverClaimed,
130 };
131 assert_serialize_eq(&msg, serialized);
132 assert_deserialize_eq(&msg, serialized);
133
134 let msg = Message::ClaimChannelEndReply(msg);
135 assert_serialize_eq(&msg, serialized);
136 assert_deserialize_eq(&msg, serialized);
137 }
138
139 #[test]
140 fn invalid_channel() {
141 let serialized = [7, 0, 0, 0, 25, 1, 2];
142
143 let msg = ClaimChannelEndReply {
144 serial: 1,
145 result: ClaimChannelEndResult::InvalidChannel,
146 };
147 assert_serialize_eq(&msg, serialized);
148 assert_deserialize_eq(&msg, serialized);
149
150 let msg = Message::ClaimChannelEndReply(msg);
151 assert_serialize_eq(&msg, serialized);
152 assert_deserialize_eq(&msg, serialized);
153 }
154
155 #[test]
156 fn already_claimed() {
157 let serialized = [7, 0, 0, 0, 25, 1, 3];
158
159 let msg = ClaimChannelEndReply {
160 serial: 1,
161 result: ClaimChannelEndResult::AlreadyClaimed,
162 };
163 assert_serialize_eq(&msg, serialized);
164 assert_deserialize_eq(&msg, serialized);
165
166 let msg = Message::ClaimChannelEndReply(msg);
167 assert_serialize_eq(&msg, serialized);
168 assert_deserialize_eq(&msg, serialized);
169 }
170}