use num_enum::{IntoPrimitive, TryFromPrimitive};
const BSD_OFFSET: u32 = 16;
const GPT_OFFSET: u32 = 64;
const SGI_OFFSET: u32 = 256;
const SUN_OFFSET: u32 = 1024;
#[derive(Clone, Copy, Debug, Eq, IntoPrimitive, PartialEq, TryFromPrimitive)]
#[repr(u32)]
#[non_exhaustive]
pub enum HeaderEntry {
BsdType = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_TYPE + BSD_OFFSET,
BsdTracksPerCylinder = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_NTRACKS + BSD_OFFSET,
BsdSectorsPerCylinder = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_SECPERCYL + BSD_OFFSET,
BsdCylindersTotal = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_CYLINDERS + BSD_OFFSET,
BsdSectorSize = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_SECSIZE + BSD_OFFSET,
BsdCylinderSkew = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_CYLINDERSKEW + BSD_OFFSET,
BsdDisk = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_DISK + BSD_OFFSET,
BsdFlags = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_FLAGS + BSD_OFFSET,
BsdHeadSwitch = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_HEADSWITCH + BSD_OFFSET,
BsdInterlave = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_INTERLEAVE + BSD_OFFSET,
BsdPackName = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_PACKNAME + BSD_OFFSET,
BsdRpm = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_RPM + BSD_OFFSET,
BsdTrackSkew = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_TRACKSKEW + BSD_OFFSET,
BsdTrackToTrackSeek = libfdisk::fdisk_labelitem_bsd_BSD_LABELITEM_TRKSEEK + BSD_OFFSET,
GenericId = libfdisk::fdisk_labelitem_gen_FDISK_LABELITEM_ID,
GptAlternateLba = libfdisk::fdisk_labelitem_gpt_GPT_LABELITEM_ALTLBA + GPT_OFFSET,
GptFirstUsableLba = libfdisk::fdisk_labelitem_gpt_GPT_LABELITEM_FIRSTLBA + GPT_OFFSET,
GptLastUsableLba = libfdisk::fdisk_labelitem_gpt_GPT_LABELITEM_LASTLBA + GPT_OFFSET,
GptDiskGuid = libfdisk::fdisk_labelitem_gpt_GPT_LABELITEM_ID + GPT_OFFSET,
GptPartitionEntryFirstLba = libfdisk::fdisk_labelitem_gpt_GPT_LABELITEM_ENTRIESLBA + GPT_OFFSET,
#[cfg(fdisk = "v2_39")]
GptPartitionEntryLastLba =
libfdisk::fdisk_labelitem_gpt_GPT_LABELITEM_ENTRIESLASTLBA + GPT_OFFSET,
GptMaxNumberOfPartitionEntries =
libfdisk::fdisk_labelitem_gpt_GPT_LABELITEM_ENTRIESALLOC + GPT_OFFSET,
SgiBootfile = libfdisk::fdisk_labelitem_sgi_SGI_LABELITEM_BOOTFILE + SGI_OFFSET,
SgiInterleave = libfdisk::fdisk_labelitem_sgi_SGI_LABELITEM_ILFACT + SGI_OFFSET,
SgiPhysicalCylindersCount = libfdisk::fdisk_labelitem_sgi_SGI_LABELITEM_PCYLCOUNT + SGI_OFFSET,
SgiSpareSectorsPerCylinder = libfdisk::fdisk_labelitem_sgi_SGI_LABELITEM_SPARECYL + SGI_OFFSET,
SunAlternateCylinders = libfdisk::fdisk_labelitem_sun_SUN_LABELITEM_ACYL + SUN_OFFSET,
SunExtraSectorsPerCylinder = libfdisk::fdisk_labelitem_sun_SUN_LABELITEM_APC + SUN_OFFSET,
SunInterleave = libfdisk::fdisk_labelitem_sun_SUN_LABELITEM_INTRLV + SUN_OFFSET,
SunPartitionTableType = libfdisk::fdisk_labelitem_sun_SUN_LABELITEM_LABELID + SUN_OFFSET,
SunPhysicalCylinders = libfdisk::fdisk_labelitem_sun_SUN_LABELITEM_PCYL + SUN_OFFSET,
SunRpm = libfdisk::fdisk_labelitem_sun_SUN_LABELITEM_RPM + SUN_OFFSET,
SunVolumeId = libfdisk::fdisk_labelitem_sun_SUN_LABELITEM_VTOCID + SUN_OFFSET,
}
impl HeaderEntry {
pub fn to_original_u32(&self) -> u32 {
let value: u32 = (*self).into();
let offset = match self {
Self::GenericId => 0,
Self::BsdCylindersTotal
| Self::BsdCylinderSkew
| Self::BsdDisk
| Self::BsdFlags
| Self::BsdHeadSwitch
| Self::BsdInterlave
| Self::BsdTracksPerCylinder
| Self::BsdPackName
| Self::BsdRpm
| Self::BsdSectorsPerCylinder
| Self::BsdSectorSize
| Self::BsdTrackSkew
| Self::BsdTrackToTrackSeek
| Self::BsdType => BSD_OFFSET,
Self::GptAlternateLba
| Self::GptMaxNumberOfPartitionEntries
| Self::GptPartitionEntryFirstLba
| Self::GptFirstUsableLba
| Self::GptDiskGuid
| Self::GptLastUsableLba => GPT_OFFSET,
#[cfg(fdisk = "v2_39")]
Self::GptPartitionEntryLastLba => GPT_OFFSET,
Self::SgiBootfile
| Self::SgiInterleave
| Self::SgiPhysicalCylindersCount
| Self::SgiSpareSectorsPerCylinder => SGI_OFFSET,
Self::SunAlternateCylinders
| Self::SunExtraSectorsPerCylinder
| Self::SunInterleave
| Self::SunPartitionTableType
| Self::SunPhysicalCylinders
| Self::SunRpm
| Self::SunVolumeId => SUN_OFFSET,
};
value - offset
}
}