crafter 0.3.0

Packet-level network interaction for Rust tools and agents.
Documentation
mod common;

use common::{arg_or, print_help_if_requested, ExampleResult, EXAMPLE_IFACE};
use crafter::prelude::*;

fn main() -> ExampleResult<()> {
    if print_help_if_requested(
        "usage: cargo run --example interface_helpers -- [--iface IFACE]\n\nInspect interface helper APIs without requiring the selected interface to exist.",
    ) {
        return Ok(());
    }

    let iface = arg_or("--iface", EXAMPLE_IFACE);
    let table = interfaces();

    println!("example: interface_helpers");
    println!("mode: offline");
    println!("selected interface: {iface}");
    println!("interfaces discovered: {}", table.len());
    for interface in table.iter().take(4) {
        println!(
            "interface: {} up={} loopback={} running={} ipv4={:?} ipv6={:?}",
            interface.name(),
            interface.is_up(),
            interface.is_loopback(),
            interface.is_running(),
            interface.first_ipv4(),
            interface.first_ipv6(false)
        );
    }

    print_result(
        "find_interface",
        find_interface(&iface).map(|info| {
            format!(
                "{} mac={:?} addresses={}",
                info.name(),
                info.mac_address(),
                info.addresses().len()
            )
        }),
    );
    print_result("default_interface_name", default_interface_name());
    print_result("get_my_mac", get_my_mac(&iface).map(|mac| mac.to_string()));
    print_result("get_my_ip", get_my_ip(&iface).map(|ip| ip.to_string()));
    print_result(
        "get_my_ipv6",
        get_my_ipv6(&iface, false).map(|ip| ip.to_string()),
    );

    let range = get_ip_strings("192.0.2.10-192.0.2.12")?;
    println!("get_ip_strings: {:?}", range);

    Ok(())
}

fn print_result<T, E>(label: &str, result: std::result::Result<T, E>)
where
    T: std::fmt::Display,
    E: std::fmt::Display,
{
    match result {
        Ok(value) => println!("{label}: {value}"),
        Err(err) => println!("{label} error: {err}"),
    }
}