#![cfg(windows)]
use crate::{DiskInfo, DiskInfoProvider, ProviderError};
use serde::Deserialize;
use wmi::{COMLibrary, WMIConnection};
#[allow(non_camel_case_types)]
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct Win32_DiskDrive {
device_id: String,
model: String,
serial_number: Option<String>,
}
pub struct WindowsProvider;
impl DiskInfoProvider for WindowsProvider {
fn get_all_disks() -> Result<Vec<DiskInfo>, ProviderError> {
let com_lib = COMLibrary::new()?;
let wmi_con = WMIConnection::new(com_lib.into())?;
let results: Vec<Win32_DiskDrive> = wmi_con.query()?;
let disks = results
.into_iter()
.map(|dev| {
let serial = dev
.serial_number
.and_then(|s| if s.trim().is_empty() { None } else { Some(s) });
DiskInfo {
name: dev.device_id,
model: Some(dev.model),
serial_number: serial,
}
})
.collect();
Ok(disks)
}
}