use torrent::peer::{Handshake, PeerId, PeerMessage, PeerState, decode, encode};
use tracing_subscriber::EnvFilter;
fn main() {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.init();
let info_hash = [0x42u8; 20];
let our_id = PeerId::random();
println!("Our peer ID: {}", our_id);
let hs = Handshake::new(info_hash, our_id.0);
let hs_bytes = hs.to_bytes();
println!("\nHandshake: {} bytes", hs_bytes.len());
let parsed = Handshake::from_bytes(&hs_bytes).expect("invalid handshake");
assert_eq!(hs, parsed);
println!("Round-trip: OK");
println!("\n=== All 11 Message Types ===");
let messages = [
("KeepAlive", PeerMessage::KeepAlive),
("Choke", PeerMessage::Choke),
("Unchoke", PeerMessage::Unchoke),
("Interested", PeerMessage::Interested),
("NotInterested", PeerMessage::NotInterested),
("Have(42)", PeerMessage::Have(42)),
("Bitfield([0xFF])", PeerMessage::Bitfield(vec![0xFF])),
(
"Request",
PeerMessage::Request {
index: 0,
begin: 0,
length: 16384,
},
),
(
"Piece",
PeerMessage::Piece {
index: 0,
begin: 0,
data: vec![0xAA; 16],
},
),
(
"Cancel",
PeerMessage::Cancel {
index: 1,
begin: 1024,
length: 8192,
},
),
("Port(6881)", PeerMessage::Port(6881)),
];
for (name, msg) in &messages {
let wire = encode(msg);
let decoded = decode(&wire).expect("decode failed");
assert_eq!(*msg, decoded, "roundtrip failed for {}", name);
println!(" {:16} → {} bytes roundtrip OK", name, wire.len());
}
println!("\n=== PeerState ===");
let states = [
PeerState::Handshake,
PeerState::Init,
PeerState::Unchoked,
PeerState::Choked,
PeerState::Closed,
];
for s in &states {
println!(" {:?}", s);
}
}