tr300-tui 1.4.3

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

#[derive(Debug, Clone, Default)]
pub struct DiskData {
    pub partitions: Vec<PartitionInfo>,
}

#[derive(Debug, Clone)]
pub struct PartitionInfo {
    pub name: String,
    pub mount_point: String,
    pub filesystem: String,
    pub total_bytes: u64,
    pub used_bytes: u64,
    pub available_bytes: u64,
    pub is_removable: bool,
    pub disk_type: DiskType,
}

#[derive(Debug, Clone, PartialEq)]
pub enum DiskType {
    Ssd,
    Hdd,
    Unknown,
}

impl std::fmt::Display for DiskType {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            DiskType::Ssd => write!(f, "SSD"),
            DiskType::Hdd => write!(f, "HDD"),
            DiskType::Unknown => write!(f, "Unknown"),
        }
    }
}

impl PartitionInfo {
    pub fn usage_percent(&self) -> f64 {
        if self.total_bytes == 0 {
            return 0.0;
        }
        (self.used_bytes as f64 / self.total_bytes as f64) * 100.0
    }
}

pub fn collect(disks: &mut Disks) -> DiskData {
    disks.refresh(true);

    let partitions = disks
        .iter()
        .map(|d| {
            let total = d.total_space();
            let available = d.available_space();
            let used = total.saturating_sub(available);

            let disk_type = match d.kind() {
                sysinfo::DiskKind::SSD => DiskType::Ssd,
                sysinfo::DiskKind::HDD => DiskType::Hdd,
                _ => DiskType::Unknown,
            };

            PartitionInfo {
                name: d.name().to_string_lossy().to_string(),
                mount_point: d.mount_point().to_string_lossy().to_string(),
                filesystem: d.file_system().to_string_lossy().to_string(),
                total_bytes: total,
                used_bytes: used,
                available_bytes: available,
                is_removable: d.is_removable(),
                disk_type,
            }
        })
        .collect();

    DiskData { partitions }
}