async-arp 0.4.0

An async ARP client library for probing hosts and sending advanced ARP requests.
Documentation
use async_arp::{Client, ClientConfigBuilder, ClientSpinner, ProbeStatus, Result};
use clap::Parser;
use std::io::Write;
use std::time::{Duration, Instant};

mod common;

#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
    let args = common::Args::parse();
    let interface = common::interface_from(&args.iface);
    let net = common::net_from(&interface).unwrap();

    let client = Client::new(
        ClientConfigBuilder::new(&args.iface)
            .with_response_timeout(Duration::from_millis(500))
            .build(),
    )?;
    let spinner = ClientSpinner::new(client).with_retries(9);

    let start = Instant::now();
    let outcomes = spinner
        .probe_batch(&common::generate_probe_inputs(net, interface))
        .await;

    let occupied = outcomes?
        .into_iter()
        .filter(|outcome| outcome.status == ProbeStatus::Occupied);
    let scan_duration = start.elapsed();

    {
        let mut stdout = std::io::stdout().lock();
        writeln!(stdout, "Found hosts:").unwrap();
        for outcome in occupied {
            writeln!(stdout, "{:?}", outcome).unwrap();
        }
        writeln!(stdout, "Scan took {:?}", scan_duration).unwrap();
    }

    Ok(())
}