#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct KgliteAbiVersion {
pub major: u32,
pub minor: u32,
pub patch: u32,
}
const fn parse_u32(s: &str) -> u32 {
let bytes = s.as_bytes();
let mut i = 0;
let mut n: u32 = 0;
while i < bytes.len() {
n = n * 10 + (bytes[i] - b'0') as u32;
i += 1;
}
n
}
const ABI_MAJOR: u32 = parse_u32(env!("CARGO_PKG_VERSION_MAJOR"));
const ABI_MINOR: u32 = parse_u32(env!("CARGO_PKG_VERSION_MINOR"));
const ABI_PATCH: u32 = parse_u32(env!("CARGO_PKG_VERSION_PATCH"));
#[no_mangle]
pub extern "C" fn kglite_abi_version() -> KgliteAbiVersion {
crate::ffi::value_boundary(
KgliteAbiVersion {
major: 0,
minor: 0,
patch: 0,
},
|| KgliteAbiVersion {
major: ABI_MAJOR,
minor: ABI_MINOR,
patch: ABI_PATCH,
},
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn abi_version_tracks_crate_version() {
let v = kglite_abi_version();
assert_eq!(
format!("{}.{}.{}", v.major, v.minor, v.patch),
format!(
"{}.{}.{}",
env!("CARGO_PKG_VERSION_MAJOR"),
env!("CARGO_PKG_VERSION_MINOR"),
env!("CARGO_PKG_VERSION_PATCH"),
)
);
}
}