tr300-tui 1.4.3

Real-time interactive system diagnostic TUI
Documentation
use sysinfo::Networks;

#[derive(Debug, Clone, Default)]
pub struct NetworkData {
    pub interfaces: Vec<InterfaceInfo>,
    pub total_download_rate: u64,
    pub total_upload_rate: u64,
}

#[derive(Debug, Clone)]
pub struct InterfaceInfo {
    pub name: String,
    pub ip_addresses: Vec<String>,
    pub mac_address: String,
    pub received_bytes: u64,
    pub transmitted_bytes: u64,
    pub download_rate: u64,
    pub upload_rate: u64,
    pub is_up: bool,
    pub operational_state: String,
}

pub fn collect(networks: &mut Networks) -> NetworkData {
    networks.refresh(true);

    let interfaces: Vec<InterfaceInfo> = networks
        .iter()
        .map(|(name, data)| {
            let operational_state = data.operational_state().to_string();
            let normalized_state = operational_state.to_ascii_lowercase();
            let is_up = matches!(
                normalized_state.as_str(),
                "up" | "unknown" | "dormant" | "lowerlayerdown"
            );

            let ip_addresses: Vec<String> = data
                .ip_networks()
                .iter()
                .map(|ip| ip.addr.to_string())
                .collect();

            InterfaceInfo {
                name: name.clone(),
                ip_addresses,
                mac_address: data.mac_address().to_string(),
                received_bytes: data.total_received(),
                transmitted_bytes: data.total_transmitted(),
                download_rate: data.received(),
                upload_rate: data.transmitted(),
                is_up,
                operational_state,
            }
        })
        .collect();

    let total_download_rate = interfaces.iter().map(|iface| iface.download_rate).sum();
    let total_upload_rate = interfaces.iter().map(|iface| iface.upload_rate).sum();

    NetworkData {
        interfaces,
        total_download_rate,
        total_upload_rate,
    }
}