use crate::modules::FmtBytes; use serde::{Serialize, Deserialize}; use serde_json::{Value, json}; pub use sysinfo::DiskKind; use sysinfo::Disks; use thiserror::Error; #[derive(Debug, Serialize, Deserialize)] pub struct StorageInfo { name: String, mount_point: String, disk_kind: DiskKind, space_left: FmtBytes, total: FmtBytes, } #[derive(Debug, Error)] pub enum StorageError { #[error("No storage drives found")] NoDisksFound, #[error("Failed to build JSON for Vec")] JsonError(#[from] serde_json::Error), } #[allow(dead_code)] pub fn get_list() -> Result, StorageError> { let disks = Disks::new_with_refreshed_list(); let disk_list = disks.list(); if disk_list.is_empty() { return Err(StorageError::NoDisksFound); } Ok(disk_list .iter() .map(|disk| StorageInfo { name: disk.name().to_string_lossy().into_owned(), mount_point: disk.mount_point().to_string_lossy().replace('\\', ""), disk_kind: disk.kind(), space_left: FmtBytes(disk.available_space()), total: FmtBytes(disk.total_space()), }) .collect()) } #[allow(dead_code)] pub fn get_json() -> Result { Ok(json!(get_list()?)) }