use crate::format::*;
use nom::{combinator::map, number::streaming::le_u16};
use std::fmt;
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct Version(pub u16);
impl fmt::Debug for Version {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{:?} v{}.{}",
self.host_system(),
self.major(),
self.minor()
)
}
}
impl Version {
pub fn parse(i: &[u8]) -> parse::Result<'_, Self> {
map(le_u16, Self)(i)
}
pub fn host_system(&self) -> HostSystem {
match self.host() {
0 => HostSystem::MsDos,
1 => HostSystem::Amiga,
2 => HostSystem::OpenVms,
3 => HostSystem::Unix,
4 => HostSystem::VmCms,
5 => HostSystem::AtariSt,
6 => HostSystem::Os2Hpfs,
7 => HostSystem::Macintosh,
8 => HostSystem::ZSystem,
9 => HostSystem::CpM,
10 => HostSystem::WindowsNtfs,
11 => HostSystem::Mvs,
12 => HostSystem::Vse,
13 => HostSystem::AcornRisc,
14 => HostSystem::Vfat,
15 => HostSystem::AlternateMvs,
16 => HostSystem::BeOs,
17 => HostSystem::Tandem,
18 => HostSystem::Os400,
19 => HostSystem::Osx,
n => HostSystem::Unknown(n),
}
}
pub fn host(&self) -> u8 {
(self.0 >> 8) as u8
}
pub fn version(&self) -> u8 {
(self.0 & 0xff) as u8
}
pub fn major(&self) -> u32 {
self.version() as u32 / 10
}
pub fn minor(&self) -> u32 {
self.version() as u32 % 10
}
}
#[derive(Debug)]
pub enum HostSystem {
MsDos,
Amiga,
OpenVms,
Unix,
VmCms,
AtariSt,
Os2Hpfs,
Macintosh,
ZSystem,
CpM,
WindowsNtfs,
Mvs,
Vse,
AcornRisc,
Vfat,
AlternateMvs,
BeOs,
Tandem,
Os400,
Osx,
Unknown(u8),
}