diff --git a/crates/buffers/src/lib.rs b/crates/buffers/src/lib.rs index 814e843..f6cae86 100644 --- a/crates/buffers/src/lib.rs +++ b/crates/buffers/src/lib.rs @@ -3,8 +3,10 @@ // // Not useful outside of librqbit. +use std::borrow::Borrow; + use bytes::Bytes; -use serde::{Deserialize, Deserializer}; +use serde::{Deserialize, Deserializer, Serialize}; use clone_to_owned::CloneToOwned; @@ -15,7 +17,9 @@ pub struct ByteBufOwned(pub bytes::Bytes); #[serde(transparent)] pub struct ByteBuf<'a>(pub &'a [u8]); -pub trait ByteBufT { +pub trait ByteBufT: + AsRef<[u8]> + std::hash::Hash + Serialize + Eq + core::fmt::Debug + CloneToOwned + Borrow<[u8]> +{ fn as_slice(&self) -> &[u8]; } diff --git a/crates/librqbit/src/torrent_state/live/mod.rs b/crates/librqbit/src/torrent_state/live/mod.rs index 6d57bcb..dc86f11 100644 --- a/crates/librqbit/src/torrent_state/live/mod.rs +++ b/crates/librqbit/src/torrent_state/live/mod.rs @@ -1682,7 +1682,10 @@ impl PeerHandler { msg.added_peers().for_each(|peer| { self.state .add_peer_if_not_seen(peer.addr) - .inspect_err(|error| warn!(?peer, ?error, "failed to add peer")) + .map_err(|error| { + warn!(?peer, ?error, "failed to add peer"); + error + }) .ok(); }); } diff --git a/crates/peer_binary_protocol/src/extended/handshake.rs b/crates/peer_binary_protocol/src/extended/handshake.rs index 8ccb80e..721fff8 100644 --- a/crates/peer_binary_protocol/src/extended/handshake.rs +++ b/crates/peer_binary_protocol/src/extended/handshake.rs @@ -1,19 +1,18 @@ -use std::{ - collections::HashMap, - net::IpAddr, -}; +use std::{collections::HashMap, net::IpAddr}; -use buffers::ByteBuf; +use buffers::{ByteBuf, ByteBufT}; use bytes::Bytes; use clone_to_owned::CloneToOwned; use serde::{Deserialize, Deserializer, Serialize}; -use crate::{EXTENDED_UT_METADATA_KEY, EXTENDED_UT_PEX_KEY, MY_EXTENDED_UT_METADATA, MY_EXTENDED_UT_PEX}; +use crate::{ + EXTENDED_UT_METADATA_KEY, EXTENDED_UT_PEX_KEY, MY_EXTENDED_UT_METADATA, MY_EXTENDED_UT_PEX, +}; use super::PeerExtendedMessageIds; #[derive(Deserialize, Serialize, Debug, Default)] -pub struct ExtendedHandshake { +pub struct ExtendedHandshake { #[serde(bound(deserialize = "ByteBuf: From<&'de [u8]>"))] pub m: HashMap, #[serde(skip_serializing_if = "Option::is_none")] @@ -50,7 +49,7 @@ impl ExtendedHandshake> { impl<'a, ByteBuf> ExtendedHandshake where - ByteBuf: Eq + std::hash::Hash + std::borrow::Borrow<[u8]>, + ByteBuf: ByteBufT, { fn get_msgid(&self, msg_type: &'a [u8]) -> Option { self.m.get(msg_type).copied() @@ -74,8 +73,8 @@ where impl CloneToOwned for ExtendedHandshake where - ByteBuf: CloneToOwned + Eq + std::hash::Hash, - ::Target: Eq + std::hash::Hash, + ByteBuf: ByteBufT, + ::Target: ByteBufT, { type Target = ExtendedHandshake<::Target>; diff --git a/crates/peer_binary_protocol/src/extended/mod.rs b/crates/peer_binary_protocol/src/extended/mod.rs index 0be0647..85296ba 100644 --- a/crates/peer_binary_protocol/src/extended/mod.rs +++ b/crates/peer_binary_protocol/src/extended/mod.rs @@ -1,9 +1,10 @@ use bencode::bencode_serialize_to_writer; use bencode::from_bytes; use bencode::BencodeValue; +use buffers::ByteBufT; use bytes::Bytes; use clone_to_owned::CloneToOwned; -use serde::{Deserialize, Serialize}; +use serde::Deserialize; use ut_pex::UtPex; use crate::MY_EXTENDED_UT_PEX; @@ -25,7 +26,7 @@ pub struct PeerExtendedMessageIds { } #[derive(Debug)] -pub enum ExtendedMessage> { +pub enum ExtendedMessage { Handshake(ExtendedHandshake), UtMetadata(UtMetadata), UtPex(UtPex), @@ -34,8 +35,8 @@ pub enum ExtendedMessage> { impl CloneToOwned for ExtendedMessage where - ByteBuf: CloneToOwned + std::hash::Hash + Eq + AsRef<[u8]>, - ::Target: std::hash::Hash + Eq + AsRef<[u8]>, + ByteBuf: ByteBufT, + ::Target: ByteBufT, { type Target = ExtendedMessage<::Target>; @@ -53,7 +54,7 @@ where } } -impl<'a, ByteBuf: 'a + std::hash::Hash + Eq + Serialize + AsRef<[u8]>> ExtendedMessage { +impl ExtendedMessage { pub fn serialize( &self, out: &mut Vec, @@ -93,9 +94,9 @@ impl<'a, ByteBuf: 'a + std::hash::Hash + Eq + Serialize + AsRef<[u8]>> ExtendedM Ok(()) } - pub fn deserialize(mut buf: &'a [u8]) -> Result + pub fn deserialize<'a>(mut buf: &'a [u8]) -> Result where - ByteBuf: Deserialize<'a> + From<&'a [u8]> + AsRef<[u8]>, + ByteBuf: Deserialize<'a> + From<&'a [u8]>, { let emsg_id = buf.first().copied().ok_or_else(|| { MessageDeserializeError::Other(anyhow::anyhow!( diff --git a/crates/peer_binary_protocol/src/extended/ut_metadata.rs b/crates/peer_binary_protocol/src/extended/ut_metadata.rs index ac7e58b..face0bd 100644 --- a/crates/peer_binary_protocol/src/extended/ut_metadata.rs +++ b/crates/peer_binary_protocol/src/extended/ut_metadata.rs @@ -1,5 +1,6 @@ use bencode::bencode_serialize_to_writer; use bencode::BencodeDeserializer; +use buffers::ByteBufT; use bytes::Bytes; use clone_to_owned::CloneToOwned; use serde::Deserialize; @@ -39,7 +40,7 @@ impl CloneToOwned for UtMetadata { } } -impl<'a, ByteBuf: 'a> UtMetadata { +impl UtMetadata { pub fn serialize(&self, buf: &mut Vec) where ByteBuf: AsRef<[u8]>, @@ -83,7 +84,7 @@ impl<'a, ByteBuf: 'a> UtMetadata { } } } - pub fn deserialize(buf: &'a [u8]) -> Result + pub fn deserialize<'a>(buf: &'a [u8]) -> Result where ByteBuf: From<&'a [u8]>, { diff --git a/crates/peer_binary_protocol/src/lib.rs b/crates/peer_binary_protocol/src/lib.rs index 71a92c5..27926df 100644 --- a/crates/peer_binary_protocol/src/lib.rs +++ b/crates/peer_binary_protocol/src/lib.rs @@ -5,7 +5,7 @@ pub mod extended; use bincode::Options; -use buffers::{ByteBuf, ByteBufOwned}; +use buffers::{ByteBuf, ByteBufOwned, ByteBufT}; use byteorder::{ByteOrder, BE}; use bytes::Bytes; use clone_to_owned::CloneToOwned; @@ -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 + AsRef<[u8]>, - ::Target: std::hash::Hash + Eq + AsRef<[u8]>, + ByteBuf: ByteBufT, + ::Target: ByteBufT, { type Target = Message<::Target>; @@ -257,7 +257,7 @@ impl<'a> std::fmt::Debug for Bitfield<'a> { impl Message where - ByteBuf: AsRef<[u8]> + std::hash::Hash + Eq + Serialize, + ByteBuf: ByteBufT, { pub fn len_prefix_and_msg_id(&self) -> (u32, u8) { match self {