#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[non_exhaustive]
pub enum DriveKind {
Nvme,
SataSsd,
Hdd,
#[default]
Unknown,
}
impl DriveKind {
#[must_use]
pub const fn as_str(&self) -> &'static str {
match self {
DriveKind::Nvme => "nvme",
DriveKind::SataSsd => "sata-ssd",
DriveKind::Hdd => "hdd",
DriveKind::Unknown => "unknown",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DriveInfo {
pub kind: DriveKind,
pub plp: super::PlpStatus,
pub logical_sector: u32,
pub physical_sector: u32,
pub optimal_block: u32,
pub queue_depth: u32,
pub total_bytes: u64,
pub available_bytes: u64,
pub nawun_lba: Option<u32>,
pub nawupf_lba: Option<u32>,
}
impl Default for DriveInfo {
fn default() -> Self {
Self {
kind: DriveKind::Unknown,
plp: super::PlpStatus::Unknown,
logical_sector: 512,
physical_sector: 4_096,
optimal_block: 65_536,
queue_depth: 1,
total_bytes: 0,
available_bytes: 0,
nawun_lba: None,
nawupf_lba: None,
}
}
}
#[must_use]
pub(super) fn probe() -> DriveInfo {
super::probe::platform::probe_drive()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_kind_is_unknown() {
assert_eq!(DriveInfo::default().kind, DriveKind::Unknown);
}
#[test]
fn test_default_logical_sector_is_512_bytes() {
assert_eq!(DriveInfo::default().logical_sector, 512);
}
#[test]
fn test_default_physical_sector_is_4_kib() {
assert_eq!(DriveInfo::default().physical_sector, 4_096);
}
#[test]
fn test_default_optimal_block_is_64_kib() {
assert_eq!(DriveInfo::default().optimal_block, 65_536);
}
#[test]
fn test_default_queue_depth_is_one() {
assert_eq!(DriveInfo::default().queue_depth, 1);
}
#[test]
fn test_default_plp_is_unknown() {
assert_eq!(DriveInfo::default().plp, super::super::PlpStatus::Unknown);
}
#[test]
fn test_kind_as_str_is_lowercase_kebab() {
assert_eq!(DriveKind::Nvme.as_str(), "nvme");
assert_eq!(DriveKind::SataSsd.as_str(), "sata-ssd");
assert_eq!(DriveKind::Hdd.as_str(), "hdd");
assert_eq!(DriveKind::Unknown.as_str(), "unknown");
}
#[test]
fn test_probe_returns_well_formed_info() {
let info = probe();
assert!(info.logical_sector >= 512);
assert!(info.physical_sector >= 512);
assert!(info.queue_depth >= 1);
}
}