use std::net::Ipv6Addr;
use std::str::FromStr;
fn main() {
println!("Testing compression of 2001:db8:85a3::8a2e:370:7334");
let ip = Ipv6Addr::from_str("2001:db8:85a3::8a2e:370:7334").unwrap();
let segments = ip.segments();
println!("IPv6 segments: {:x?}", segments);
let mut compressed = Vec::new();
compressed.extend_from_slice(&segments[2].to_be_bytes()); compressed.extend_from_slice(&segments[3].to_be_bytes());
println!("After storing segments 2-3: {:?}", compressed);
let non_zero_interface: Vec<(usize, u16)> = segments[4..8]
.iter()
.enumerate()
.filter(|&(_, &seg)| seg != 0)
.map(|(i, &seg)| (i + 4, seg))
.collect();
println!("Non-zero interface segments: {:?}", non_zero_interface);
compressed.insert(0, 2);
for &(pos, val) in &non_zero_interface {
compressed.push((pos - 4) as u8);
compressed.extend_from_slice(&val.to_be_bytes());
}
compressed.push(255);
println!("Final compressed data: {:?}", compressed);
println!("Expected: [2, 133, 163, 0, 0, 1, 138, 46, 2, 3, 112, 3, 115, 52, 255]");
let expected = vec![2, 133, 163, 0, 0, 1, 138, 46, 2, 3, 112, 3, 115, 52, 255];
if compressed == expected {
println!("✅ Compression is correct!");
} else {
println!("❌ Compression mismatch");
println!("Got: {:?}", compressed);
println!("Expected: {:?}", expected);
}
}