dispatch-proxy 0.2.4

A SOCKS proxy that balances traffic between network interfaces.
use crate::net::get_valid_addresses;
use network_interface::{NetworkInterface, NetworkInterfaceConfig};
use owo_colors::OwoColorize;
use term_table::{
    row::Row,
    table_cell::{Alignment, TableCell},
    Table, TableStyle,
};

pub fn list() {
    let mut table = Table::new();
    table.max_column_width = 41;
    table.style = TableStyle::extended();

    for interface in NetworkInterface::show()
        .expect("failed to retrieve network interfaces")
        .into_iter()
        .filter(|interface| !interface.addr.is_empty())
    {
        let addrs = {
            let mut addrs = get_valid_addresses(&interface.addr);
            addrs.sort_by_key(|addr| addr.is_ipv6());
            addrs
        };

        if addrs.is_empty() {
            continue;
        }

        table.add_row(Row::new(vec![
            TableCell::builder(interface.name.bold())
                .col_span(1)
                .alignment(Alignment::Right),
            TableCell::builder(
                addrs
                    .iter()
                    .map(ToString::to_string)
                    .collect::<Vec<_>>()
                    .join("\n"),
            )
            .col_span(1)
            .alignment(Alignment::Left),
        ]));
    }

    println!("{}", table.render());
}