#![warn(missing_docs)]
pub mod compact;
mod error;
mod http;
mod udp;
pub use compact::{
encode_compact_peers, encode_compact_peers6, parse_compact_peers, parse_compact_peers6,
};
pub use error::{Error, Result};
pub use http::{HttpAnnounceResponse, HttpScrapeResponse, HttpTracker};
pub use udp::{UdpAnnounceResponse, UdpScrapeResponse, UdpTracker, UdpTrackerOption};
use std::net::SocketAddr;
use irontide_core::Id20;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScrapeInfo {
pub complete: u32,
pub incomplete: u32,
pub downloaded: u32,
}
#[must_use]
pub fn announce_url_to_scrape(url: &str) -> Option<String> {
let last_pos = url.rfind("announce")?;
let mut result = String::with_capacity(url.len());
result.push_str(&url[..last_pos]);
result.push_str("scrape");
result.push_str(&url[last_pos + "announce".len()..]);
Some(result)
}
#[derive(Debug, Clone)]
pub struct AnnounceRequest {
pub info_hash: Id20,
pub peer_id: Id20,
pub port: u16,
pub uploaded: u64,
pub downloaded: u64,
pub left: u64,
pub event: AnnounceEvent,
pub num_want: Option<i32>,
pub compact: bool,
pub i2p_destination: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AnnounceEvent {
None = 0,
Completed = 1,
Started = 2,
Stopped = 3,
}
#[derive(Debug, Clone)]
pub struct AnnounceResponse {
pub interval: u32,
pub seeders: Option<u32>,
pub leechers: Option<u32>,
pub peers: Vec<SocketAddr>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn scrape_info_equality() {
let a = ScrapeInfo {
complete: 5,
incomplete: 3,
downloaded: 50,
};
let b = ScrapeInfo {
complete: 5,
incomplete: 3,
downloaded: 50,
};
assert_eq!(a, b);
}
#[test]
fn announce_to_scrape_url_http() {
assert_eq!(
announce_url_to_scrape("http://t.co/announce"),
Some("http://t.co/scrape".into()),
);
}
#[test]
fn announce_to_scrape_url_with_path() {
assert_eq!(
announce_url_to_scrape("http://t.co/path/announce"),
Some("http://t.co/path/scrape".into()),
);
}
#[test]
fn announce_to_scrape_url_no_announce() {
assert_eq!(announce_url_to_scrape("http://t.co/track"), None);
}
}