use alloc::boxed::Box;
use alloc::format;
use core::fmt::Display;
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug)]
pub struct PackageVersion(u64);
impl PackageVersion {
pub fn from_u64(value: u64) -> Self {
Self(value)
}
pub fn to_u64(&self) -> u64 {
self.0
}
fn from_version(major: u16, minor: u16, patch: u16) -> Self {
Self(((major as u64) << 32) | ((minor as u64) << 16) | patch as u64)
}
pub fn major(&self) -> u16 {
((self.0 >> 32) & (u16::MAX as u64)) as u16
}
pub fn minor(&self) -> u16 {
((self.0 >> 16) & (u16::MAX as u64)) as u16
}
pub fn patch(&self) -> u16 {
((self.0) & (u16::MAX as u64)) as u16
}
pub fn get() -> PackageVersion {
const MAJOR: u16 = 0;
const MINOR: u16 = 8;
const PATCH: u16 = 1;
PackageVersion::from_version(MAJOR, MINOR, PATCH)
}
pub fn get_str() -> &'static str {
let version = PackageVersion::get();
let version_str = format!("{version}");
Box::leak(version_str.into_boxed_str())
}
}
impl Display for PackageVersion {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{}.{}.{}", self.major(), self.minor(), self.patch())
}
}