use std::{fmt::Display, sync::OnceLock};
static VERSION_INFO_PKG: OnceLock<VersionInfo> = OnceLock::new();
static VERSION_INFO_SYS: OnceLock<VersionInfo> = OnceLock::new();
pub struct VersionInfo {
pub major: u16,
pub minor: u16,
pub patch: u16,
}
pub fn get_version() -> (&'static VersionInfo, &'static VersionInfo) {
(
VERSION_INFO_PKG.get_or_init(|| {
parse_version(env!("CARGO_PKG_VERSION", "Package version not defined!"))
}),
VERSION_INFO_SYS.get_or_init(|| parse_version(crate::fapi_sys::TSS2_FAPI_VERSION)),
)
}
fn parse_version(version_string: &str) -> VersionInfo {
let mut tokens = version_string
.split('.')
.map(|str| u16::from_str_radix(str, 10).unwrap_or_default());
VersionInfo {
major: tokens.next().unwrap_or_default(),
minor: tokens.next().unwrap_or_default(),
patch: tokens.next().unwrap_or_default(),
}
}
impl Display for VersionInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}.{}.{}", self.major, self.minor, self.patch)
}
}