Optimize peers a bit
This commit is contained in:
parent
32789f3c8c
commit
f00f522767
1 changed files with 16 additions and 15 deletions
|
|
@ -56,21 +56,17 @@ impl<'a> DictPeer<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Peers<'a> {
|
pub struct Peers {
|
||||||
Full(Vec<DictPeer<'a>>),
|
addrs: Vec<SocketAddr>,
|
||||||
Compact(Vec<SocketAddrV4>),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Peers<'a> {
|
impl Peers {
|
||||||
pub fn iter_sockaddrs(&self) -> Box<dyn Iterator<Item = std::net::SocketAddr> + '_> {
|
pub fn iter_sockaddrs(&self) -> impl Iterator<Item = std::net::SocketAddr> + '_ {
|
||||||
match self {
|
self.addrs.iter().copied()
|
||||||
Peers::Full(d) => Box::new(d.iter().map(DictPeer::as_sockaddr)),
|
|
||||||
Peers::Compact(c) => Box::new(c.iter().copied().map(SocketAddr::V4)),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'de: 'a, 'a> serde::de::Deserialize<'de> for Peers<'a> {
|
impl<'de> serde::de::Deserialize<'de> for Peers {
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
|
|
@ -79,7 +75,7 @@ impl<'de: 'a, 'a> serde::de::Deserialize<'de> for Peers<'a> {
|
||||||
phantom: std::marker::PhantomData<&'de ()>,
|
phantom: std::marker::PhantomData<&'de ()>,
|
||||||
}
|
}
|
||||||
impl<'de> serde::de::Visitor<'de> for Visitor<'de> {
|
impl<'de> serde::de::Visitor<'de> for Visitor<'de> {
|
||||||
type Value = Peers<'de>;
|
type Value = Peers;
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
formatter.write_str("a list of peers in dict or binary format")
|
formatter.write_str("a list of peers in dict or binary format")
|
||||||
|
|
@ -91,16 +87,21 @@ impl<'de: 'a, 'a> serde::de::Deserialize<'de> for Peers<'a> {
|
||||||
{
|
{
|
||||||
let mut peers = Vec::new();
|
let mut peers = Vec::new();
|
||||||
while let Some(peer) = seq.next_element::<DictPeer>()? {
|
while let Some(peer) = seq.next_element::<DictPeer>()? {
|
||||||
peers.push(peer)
|
peers.push(peer.as_sockaddr())
|
||||||
}
|
}
|
||||||
Ok(Peers::Full(peers))
|
Ok(Peers { addrs: peers })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
|
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
|
||||||
where
|
where
|
||||||
E: serde::de::Error,
|
E: serde::de::Error,
|
||||||
{
|
{
|
||||||
Ok(Peers::Compact(parse_compact_peers(v)))
|
Ok(Peers {
|
||||||
|
addrs: parse_compact_peers(v)
|
||||||
|
.into_iter()
|
||||||
|
.map(|v| v.into())
|
||||||
|
.collect(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
deserializer.deserialize_any(Visitor {
|
deserializer.deserialize_any(Visitor {
|
||||||
|
|
@ -153,7 +154,7 @@ pub struct TrackerResponse<'a> {
|
||||||
pub min_interval: Option<u64>,
|
pub min_interval: Option<u64>,
|
||||||
pub tracker_id: Option<ByteBuf<'a>>,
|
pub tracker_id: Option<ByteBuf<'a>>,
|
||||||
pub incomplete: u64,
|
pub incomplete: u64,
|
||||||
pub peers: Peers<'a>,
|
pub peers: Peers,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TrackerRequest {
|
impl TrackerRequest {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue