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