use crate::boot_code::BootCodeId;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub enum Alignment {
Mib1,
LegacyTrack,
Unaligned,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub enum PartitioningEra {
Modern,
LegacyCylinder,
Unknown,
}
#[must_use]
pub fn classify_alignment(lba_start: u64) -> Alignment {
if lba_start != 0 && lba_start % 2048 == 0 {
Alignment::Mib1
} else if lba_start == 63 {
Alignment::LegacyTrack
} else {
Alignment::Unaligned
}
}
#[must_use]
pub fn infer_era(first_partition_lba: Option<u64>, boot: BootCodeId) -> PartitioningEra {
match first_partition_lba.map(classify_alignment) {
Some(Alignment::Mib1) => PartitioningEra::Modern,
Some(Alignment::LegacyTrack) => PartitioningEra::LegacyCylinder,
_ => era_from_boot_code(boot),
}
}
fn era_from_boot_code(boot: BootCodeId) -> PartitioningEra {
match boot {
BootCodeId::WindowsVista | BootCodeId::Windows7Plus | BootCodeId::Grub2 => {
PartitioningEra::Modern
}
BootCodeId::GrubLegacy => PartitioningEra::LegacyCylinder,
_ => PartitioningEra::Unknown,
}
}