From c7b7dc300ff065ec206bf06d10ab90e7069204b0 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Sun, 25 Aug 2024 13:20:13 +0100 Subject: [PATCH] impl Debug for UtPex --- .../peer_binary_protocol/src/extended/mod.rs | 27 +++++++++-------- .../src/extended/ut_pex.rs | 29 ++++++++++++++++--- crates/peer_binary_protocol/src/lib.rs | 6 ++-- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/crates/peer_binary_protocol/src/extended/mod.rs b/crates/peer_binary_protocol/src/extended/mod.rs index 5ffecac..0be0647 100644 --- a/crates/peer_binary_protocol/src/extended/mod.rs +++ b/crates/peer_binary_protocol/src/extended/mod.rs @@ -25,7 +25,7 @@ pub struct PeerExtendedMessageIds { } #[derive(Debug)] -pub enum ExtendedMessage { +pub enum ExtendedMessage> { Handshake(ExtendedHandshake), UtMetadata(UtMetadata), UtPex(UtPex), @@ -34,8 +34,8 @@ pub enum ExtendedMessage { impl CloneToOwned for ExtendedMessage where - ByteBuf: CloneToOwned + std::hash::Hash + Eq, - ::Target: std::hash::Hash + Eq, + ByteBuf: CloneToOwned + std::hash::Hash + Eq + AsRef<[u8]>, + ::Target: std::hash::Hash + Eq + AsRef<[u8]>, { type Target = ExtendedMessage<::Target>; @@ -53,7 +53,7 @@ where } } -impl<'a, ByteBuf: 'a + std::hash::Hash + Eq + Serialize> ExtendedMessage { +impl<'a, ByteBuf: 'a + std::hash::Hash + Eq + Serialize + AsRef<[u8]>> ExtendedMessage { pub fn serialize( &self, out: &mut Vec, @@ -72,27 +72,30 @@ impl<'a, ByteBuf: 'a + std::hash::Hash + Eq + Serialize> ExtendedMessage { - let emsg_id = extended_handshake_ut_metadata().ut_metadata.ok_or_else(|| { - anyhow::anyhow!("need peer's handshake to serialize ut_metadata") - })?; + let emsg_id = extended_handshake_ut_metadata() + .ut_metadata + .ok_or_else(|| { + anyhow::anyhow!("need peer's handshake to serialize ut_metadata") + })?; out.push(emsg_id); u.serialize(out); - }, + } ExtendedMessage::UtPex(m) => { let emsg_id = extended_handshake_ut_metadata().ut_pex.ok_or_else(|| { - anyhow::anyhow!("need peer's handshake to serialize ut_pex, or peer does't support ut_pex") + anyhow::anyhow!( + "need peer's handshake to serialize ut_pex, or peer does't support ut_pex" + ) })?; out.push(emsg_id); bencode_serialize_to_writer(m, out)?; - }, - + } } Ok(()) } pub fn deserialize(mut buf: &'a [u8]) -> Result where - ByteBuf: Deserialize<'a> + From<&'a [u8]>, + ByteBuf: Deserialize<'a> + From<&'a [u8]> + AsRef<[u8]>, { let emsg_id = buf.first().copied().ok_or_else(|| { MessageDeserializeError::Other(anyhow::anyhow!( diff --git a/crates/peer_binary_protocol/src/extended/ut_pex.rs b/crates/peer_binary_protocol/src/extended/ut_pex.rs index 00014c1..149e8c0 100644 --- a/crates/peer_binary_protocol/src/extended/ut_pex.rs +++ b/crates/peer_binary_protocol/src/extended/ut_pex.rs @@ -12,7 +12,7 @@ pub struct PexPeerInfo { pub addr: SocketAddr, } -#[derive(Debug, Serialize, Default, Deserialize)] +#[derive(Serialize, Default, Deserialize)] pub struct UtPex { added: B, #[serde(rename = "added.f")] @@ -26,6 +26,27 @@ pub struct UtPex { dropped6: B, } +impl core::fmt::Debug for UtPex +where + B: AsRef<[u8]>, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + struct IterDebug(I); + impl core::fmt::Debug for IterDebug + where + I: Iterator + Clone, + { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_list().entries(self.0.clone()).finish() + } + } + f.debug_struct("UtPex") + .field("added", &IterDebug(self.added_peers())) + .field("dropped", &IterDebug(self.dropped_peers())) + .finish() + } +} + impl CloneToOwned for UtPex where B: CloneToOwned, @@ -52,7 +73,7 @@ where buf: &'a B, flags: &'a Option, ip_len: usize, - ) -> impl Iterator + 'a { + ) -> impl Iterator + Clone + 'a { let addrs = buf.as_ref().chunks_exact(ip_len + 2).map(move |c| { let ip = match ip_len { 4 => IpAddr::from(TryInto::<[u8; 4]>::try_into(&c[..4]).unwrap()), @@ -74,12 +95,12 @@ where }) } - pub fn added_peers(&self) -> impl Iterator + '_ { + pub fn added_peers(&self) -> impl Iterator + Clone + '_ { self.added_peers_inner(&self.added, &self.added_f, 4) .chain(self.added_peers_inner(&self.added6, &self.added6_f, 16)) } - pub fn dropped_peers(&self) -> impl Iterator + '_ { + pub fn dropped_peers(&self) -> impl Iterator + Clone + '_ { self.added_peers_inner(&self.dropped, &None, 4) .chain(self.added_peers_inner(&self.dropped6, &None, 16)) } diff --git a/crates/peer_binary_protocol/src/lib.rs b/crates/peer_binary_protocol/src/lib.rs index 64a39e5..71a92c5 100644 --- a/crates/peer_binary_protocol/src/lib.rs +++ b/crates/peer_binary_protocol/src/lib.rs @@ -186,7 +186,7 @@ impl From for MessageDeserializeError { } #[derive(Debug)] -pub enum Message { +pub enum Message> { Request(Request), Cancel(Request), Bitfield(ByteBuf), @@ -212,8 +212,8 @@ pub struct Bitfield<'a> { impl CloneToOwned for Message where - ByteBuf: CloneToOwned + std::hash::Hash + Eq, - ::Target: std::hash::Hash + Eq, + ByteBuf: CloneToOwned + std::hash::Hash + Eq + AsRef<[u8]>, + ::Target: std::hash::Hash + Eq + AsRef<[u8]>, { type Target = Message<::Target>;