ark_api_ffi/
version.rs

1#[derive(Copy, Clone, Debug, PartialEq, Eq)]
2pub struct Semver {
3    major: u8,
4    minor: u8,
5    patch: u8,
6    pre: u8,
7}
8
9impl Semver {
10    pub const fn pack(self) -> u64 {
11        (self.major as u64) << 24
12            | (self.minor as u64) << 16
13            | (self.patch as u64) << 8
14            | (self.pre as u64)
15    }
16
17    pub const fn unpack(v: u64) -> Self {
18        Self {
19            major: (v >> 24) as u8,
20            minor: (v >> 16) as u8,
21            patch: (v >> 8) as u8,
22            pre: v as u8,
23        }
24    }
25}
26
27impl std::fmt::Display for Semver {
28    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
29        write!(f, "{}.{}.{}", self.major, self.minor, self.patch)?;
30        if self.pre > 0 {
31            write!(f, "-pre.{}", self.pre)?;
32        }
33        Ok(())
34    }
35}
36
37#[allow(unsafe_code)]
38#[no_mangle]
39#[used]
40#[doc(hidden)]
41pub static ARK_PACKED_FFI_CRATE_VERSION: u64 = Semver {
42    major: 0,
43    minor: 16,
44    patch: 0,
45    pre: 0,
46}
47.pack();
48
49#[cfg(test)]
50mod test {
51    use super::*;
52
53    #[test]
54    #[allow(clippy::panic)]
55    fn crate_version_match() {
56        let version = Semver::unpack(ARK_PACKED_FFI_CRATE_VERSION);
57        let version_str = version.to_string();
58
59        if version_str != env!("CARGO_PKG_VERSION") {
60            panic!("Crate version mismatch, please update ARK_PACKED_FFI_CRATE_VERSION (\"{version_str}\") to be the same as the crate version in `api/api-ffi/Cargo.toml` (\"{}\")", env!("CARGO_PKG_VERSION"));
61        }
62    }
63}