use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct BuildIdentity {
pub package_version: String,
pub display: String,
pub revision: String,
pub dirty: bool,
}
impl BuildIdentity {
pub fn current() -> Self {
Self {
package_version: package_version().to_string(),
display: display_version().to_string(),
revision: revision().to_string(),
dirty: dirty(),
}
}
pub fn is_compatible_build(&self, other: &Self) -> bool {
self.display == other.display
}
}
pub const fn package_version() -> &'static str {
env!("CARGO_PKG_VERSION")
}
pub const fn revision() -> &'static str {
env!("WINX_BUILD_REVISION")
}
pub fn dirty() -> bool {
env!("WINX_BUILD_DIRTY") == "true"
}
pub const fn display_version() -> &'static str {
env!("WINX_BUILD_IDENTITY")
}
#[cfg(test)]
mod tests {
#[test]
fn display_identity_contains_package_and_revision() {
let identity = super::display_version();
assert!(identity.starts_with(super::package_version()));
assert!(identity.contains(super::revision()));
}
#[test]
fn owned_identity_matches_compile_time_values() {
let identity = super::BuildIdentity::current();
assert_eq!(identity.package_version, super::package_version());
assert_eq!(identity.display, super::display_version());
assert_eq!(identity.revision, super::revision());
assert_eq!(identity.dirty, super::dirty());
assert!(identity.is_compatible_build(&identity));
}
}