use num_enum::{FromPrimitive, IntoPrimitive};
use ownable::{IntoOwned, ToOwned};
use std::fmt;
use winnow::{binary::le_u8, seq, PResult, Parser, Partial};
#[derive(Clone, Copy, ToOwned, IntoOwned, PartialEq, Eq, Hash)]
pub struct Version {
pub host_system: HostSystem,
pub version: u8,
}
impl fmt::Debug for Version {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?} v{}", self.host_system, self.version)
}
}
impl Version {
pub fn parser(i: &mut Partial<&'_ [u8]>) -> PResult<Self> {
seq! {Self {
version: le_u8,
host_system: le_u8.map(HostSystem::from),
}}
.parse_next(i)
}
}
#[derive(
Debug, Clone, Copy, IntoPrimitive, FromPrimitive, ToOwned, IntoOwned, PartialEq, Eq, Hash,
)]
#[repr(u8)]
pub enum HostSystem {
MsDos = 0,
Amiga = 1,
OpenVms = 2,
Unix = 3,
VmCms = 4,
AtariSt = 5,
Os2Hpfs = 6,
Macintosh = 7,
ZSystem = 8,
CpM = 9,
WindowsNtfs = 10,
Mvs = 11,
Vse = 12,
AcornRisc = 13,
Vfat = 14,
AlternateMvs = 15,
BeOs = 16,
Tandem = 17,
Os400 = 18,
Osx = 19,
#[num_enum(catch_all)]
Unknown(u8),
}