#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct MbrPartitionType {
pub code: u8,
pub name: &'static str,
}
pub const PARTITION_TYPES: &[MbrPartitionType] = &[
MbrPartitionType {
code: 0x00,
name: "Empty",
},
MbrPartitionType {
code: 0x01,
name: "FAT12",
},
MbrPartitionType {
code: 0x04,
name: "FAT16 <32 MB",
},
MbrPartitionType {
code: 0x05,
name: "Extended (CHS)",
},
MbrPartitionType {
code: 0x06,
name: "FAT16",
},
MbrPartitionType {
code: 0x07,
name: "NTFS / exFAT / IFS",
},
MbrPartitionType {
code: 0x08,
name: "FAT32 (EISA / AIX)",
},
MbrPartitionType {
code: 0x0A,
name: "OS/2 Boot Manager",
},
MbrPartitionType {
code: 0x0B,
name: "FAT32 (CHS)",
},
MbrPartitionType {
code: 0x0C,
name: "FAT32 (LBA)",
},
MbrPartitionType {
code: 0x0E,
name: "FAT16 (LBA)",
},
MbrPartitionType {
code: 0x0F,
name: "Extended (LBA)",
},
MbrPartitionType {
code: 0x11,
name: "Hidden FAT12",
},
MbrPartitionType {
code: 0x12,
name: "Compaq diagnostics / OEM",
},
MbrPartitionType {
code: 0x14,
name: "Hidden FAT16 <32 MB",
},
MbrPartitionType {
code: 0x16,
name: "Hidden FAT16",
},
MbrPartitionType {
code: 0x17,
name: "Hidden NTFS / IFS",
},
MbrPartitionType {
code: 0x1B,
name: "Hidden FAT32 (CHS)",
},
MbrPartitionType {
code: 0x1C,
name: "Hidden FAT32 (LBA)",
},
MbrPartitionType {
code: 0x1E,
name: "Hidden FAT16 (LBA)",
},
MbrPartitionType {
code: 0x27,
name: "Windows Recovery / Hidden NTFS",
},
MbrPartitionType {
code: 0x39,
name: "Plan 9",
},
MbrPartitionType {
code: 0x42,
name: "Windows LDM / Dynamic Disk",
},
MbrPartitionType {
code: 0x82,
name: "Linux Swap / Solaris",
},
MbrPartitionType {
code: 0x83,
name: "Linux",
},
MbrPartitionType {
code: 0x84,
name: "Hibernate (Windows)",
},
MbrPartitionType {
code: 0x85,
name: "Linux Extended",
},
MbrPartitionType {
code: 0x86,
name: "Linux LVM (old)",
},
MbrPartitionType {
code: 0x87,
name: "NTFS Volume Set",
},
MbrPartitionType {
code: 0x8E,
name: "Linux LVM",
},
MbrPartitionType {
code: 0x9F,
name: "BSD/OS",
},
MbrPartitionType {
code: 0xA0,
name: "Laptop hibernation",
},
MbrPartitionType {
code: 0xA5,
name: "FreeBSD",
},
MbrPartitionType {
code: 0xA6,
name: "OpenBSD",
},
MbrPartitionType {
code: 0xA8,
name: "macOS UFS",
},
MbrPartitionType {
code: 0xA9,
name: "NetBSD",
},
MbrPartitionType {
code: 0xAB,
name: "macOS Boot",
},
MbrPartitionType {
code: 0xAF,
name: "macOS HFS+",
},
MbrPartitionType {
code: 0xBE,
name: "Solaris Boot",
},
MbrPartitionType {
code: 0xBF,
name: "Solaris",
},
MbrPartitionType {
code: 0xEB,
name: "BeOS / Haiku",
},
MbrPartitionType {
code: 0xEE,
name: "GPT Protective MBR",
},
MbrPartitionType {
code: 0xEF,
name: "EFI System Partition (FAT)",
},
MbrPartitionType {
code: 0xFB,
name: "VMware VMFS",
},
MbrPartitionType {
code: 0xFC,
name: "VMware Swap",
},
MbrPartitionType {
code: 0xFD,
name: "Linux RAID",
},
MbrPartitionType {
code: 0xFE,
name: "Linux LAF / IBM IML",
},
];
#[must_use]
pub fn type_name(code: u8) -> Option<&'static str> {
PARTITION_TYPES
.iter()
.find(|t| t.code == code)
.map(|t| t.name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn known_codes_resolve() {
assert_eq!(type_name(0x00), Some("Empty"));
assert_eq!(type_name(0x07), Some("NTFS / exFAT / IFS"));
assert_eq!(type_name(0x83), Some("Linux"));
assert_eq!(type_name(0xEE), Some("GPT Protective MBR"));
}
#[test]
fn unknown_code_is_none() {
assert_eq!(type_name(0xCC), None);
assert_eq!(type_name(0xCD), None);
}
#[test]
fn codes_are_unique() {
let mut seen = std::collections::HashSet::new();
for t in PARTITION_TYPES {
assert!(seen.insert(t.code), "duplicate code {:#04X}", t.code);
assert!(!t.name.is_empty());
}
}
}