use std::fmt::Display;
use std::fmt::Debug;
use std::fmt::Result;
use std::fmt::Formatter;
const MODIFIER_MAJOR : u32 = 16_777_216;
const MODIFIER_MINOR : u32 = 65_536;
const MODIFIER_BUILD : u32 = 256;
pub struct Version {
raw_version: u32
}
impl Version {
#[allow(clippy::cast_lossless)] pub const fn new(major: u8, minor: u8, build: u8, revision: u8) -> Version {
Version {
raw_version: major as u32 * MODIFIER_MAJOR
+ minor as u32 * MODIFIER_MINOR
+ build as u32 * MODIFIER_BUILD
+ revision as u32
}
}
pub const fn from_raw(raw: u32) -> Version {
Version {
raw_version: raw
}
}
pub fn major(&self) -> u8 {
((self.raw_version / MODIFIER_MAJOR) % 256) as u8
}
pub fn minor(&self) -> u8 {
((self.raw_version / MODIFIER_MINOR) % 256) as u8
}
pub fn build(&self) -> u8 {
((self.raw_version / MODIFIER_BUILD) % 256) as u8
}
pub fn revision(&self) -> u8 {
(self.raw_version % 256) as u8
}
pub fn raw(&self) -> u32 {
self.raw_version
}
}
impl Debug for Version {
fn fmt(&self, f: &mut Formatter) -> Result {
write!(f, "{}.{}.{}-{}@{}", self.major(), self.minor(), self.build(), self.revision(), self.raw())
}
}
impl Display for Version {
fn fmt(&self, f: &mut Formatter) -> Result {
write!(f, "{}.{}.{}-{}", self.major(), self.minor(), self.build(), self.revision())
}
}