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}