use std::time::Instant;
use flowscope::layers::{LayerKind, LayerParser, LayerStack, Layers};
use flowscope::pcap::PcapFlowSource;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let path = std::env::args()
.nth(1)
.unwrap_or_else(|| "tests/data/mixed_short.pcap".to_string());
let frames: Vec<Vec<u8>> = PcapFlowSource::open(&path)?
.views()
.filter_map(|r| r.ok().map(|v| v.frame))
.collect();
println!("loaded {} frames from {}", frames.len(), path);
let start = Instant::now();
let mut ergo_tcp = 0usize;
for f in &frames {
if let Ok(l) = Layers::parse_ethernet(f)
&& l.tcp().is_some()
{
ergo_tcp += 1;
}
}
let ergo = start.elapsed();
let parser = LayerParser::new().only(&[LayerKind::Ipv4, LayerKind::Tcp]);
let mut stack = LayerStack::new();
let start = Instant::now();
let mut fast_tcp = 0usize;
for f in &frames {
stack.reset();
if parser.parse_ethernet(f, &mut stack).is_ok() && stack.tcp().is_some() {
fast_tcp += 1;
}
}
let fast = start.elapsed();
println!();
println!("Ergonomic Layers::parse_ethernet + .tcp(): {ergo_tcp} hits in {ergo:?}");
println!("Fast-path LayerParser + .tcp(): {fast_tcp} hits in {fast:?}");
if fast.as_nanos() > 0 {
let speedup = ergo.as_secs_f64() / fast.as_secs_f64();
println!("Speedup: {speedup:.2}× (fewer frames or larger captures show more)");
}
assert_eq!(
ergo_tcp, fast_tcp,
"both paths should yield identical results"
);
Ok(())
}