#[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: bool,
pub logical_sector: u32,
pub physical_sector: u32,
pub optimal_block: u32,
pub queue_depth: u32,
pub total_bytes: u64,
pub available_bytes: u64,
}
impl Default for DriveInfo {
fn default() -> Self {
Self {
kind: DriveKind::Unknown,
plp: false,
logical_sector: 512,
physical_sector: 4_096,
optimal_block: 65_536,
queue_depth: 1,
total_bytes: 0,
available_bytes: 0,
}
}
}
#[must_use]
pub(super) fn probe() -> DriveInfo {
DriveInfo::default()
}
#[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_false() {
assert!(!DriveInfo::default().plp);
}
#[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_matches_default_in_foundation_phase() {
assert_eq!(probe(), DriveInfo::default());
}
}