diff --git a/crates/librqbit/src/tracker_comms.rs b/crates/librqbit/src/tracker_comms.rs index 3d26a37..e3b3987 100644 --- a/crates/librqbit/src/tracker_comms.rs +++ b/crates/librqbit/src/tracker_comms.rs @@ -56,21 +56,17 @@ impl<'a> DictPeer<'a> { } #[derive(Debug)] -pub enum Peers<'a> { - Full(Vec>), - Compact(Vec), +pub struct Peers { + addrs: Vec, } -impl<'a> Peers<'a> { - pub fn iter_sockaddrs(&self) -> Box + '_> { - match self { - Peers::Full(d) => Box::new(d.iter().map(DictPeer::as_sockaddr)), - Peers::Compact(c) => Box::new(c.iter().copied().map(SocketAddr::V4)), - } +impl Peers { + pub fn iter_sockaddrs(&self) -> impl Iterator + '_ { + self.addrs.iter().copied() } } -impl<'de: 'a, 'a> serde::de::Deserialize<'de> for Peers<'a> { +impl<'de> serde::de::Deserialize<'de> for Peers { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, @@ -79,7 +75,7 @@ impl<'de: 'a, 'a> serde::de::Deserialize<'de> for Peers<'a> { phantom: std::marker::PhantomData<&'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 { 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(); while let Some(peer) = seq.next_element::()? { - peers.push(peer) + peers.push(peer.as_sockaddr()) } - Ok(Peers::Full(peers)) + Ok(Peers { addrs: peers }) } fn visit_bytes(self, v: &[u8]) -> Result where 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 { @@ -153,7 +154,7 @@ pub struct TrackerResponse<'a> { pub min_interval: Option, pub tracker_id: Option>, pub incomplete: u64, - pub peers: Peers<'a>, + pub peers: Peers, } impl TrackerRequest {