You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
785 B
Rust
35 lines
785 B
Rust
use std::collections::HashMap;
|
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
use url::Url;
|
|
|
|
pub struct TrackerManager {
|
|
counter: AtomicUsize,
|
|
trackers: HashMap<usize, Tracker>,
|
|
url_index: HashMap<String, usize>,
|
|
}
|
|
|
|
pub struct Tracker {
|
|
url: Url,
|
|
}
|
|
|
|
pub type TrackerId = usize;
|
|
|
|
impl TrackerManager {
|
|
pub fn get_tracker_id(&mut self, url: &Url) -> Option<TrackerId> {
|
|
// dht is not a tracker bye
|
|
if url.scheme() == "dht" {
|
|
return None;
|
|
}
|
|
|
|
let url_str = url.as_str();
|
|
if let Some(id) = self.url_index.get(url_str) {
|
|
return Some(*id);
|
|
}
|
|
|
|
let new_id = self.counter.fetch_add(1, Ordering::AcqRel);
|
|
self.url_index.insert(url_str.to_string(), new_id);
|
|
|
|
Some(new_id)
|
|
}
|
|
}
|