Optimize peers a bit

This commit is contained in:
Igor Katson 2021-07-14 13:16:01 +01:00
parent 32789f3c8c
commit f00f522767

View file

@ -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 {