fluidlite/
version.rs

1use crate::ffi;
2use std::{
3    fmt::{Display, Formatter, Result as FmtResult},
4    mem::MaybeUninit,
5};
6
7/**
8The library version info
9 */
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub struct Version {
12    pub major: u32,
13    pub minor: u32,
14    pub micro: u32,
15}
16
17impl Display for Version {
18    fn fmt(&self, f: &mut Formatter) -> FmtResult {
19        self.major.fmt(f)?;
20        '.'.fmt(f)?;
21        self.minor.fmt(f)?;
22        '.'.fmt(f)?;
23        self.micro.fmt(f)
24    }
25}
26
27impl Version {
28    pub fn new(major: u32, minor: u32, micro: u32) -> Self {
29        Self {
30            major,
31            minor,
32            micro,
33        }
34    }
35
36    pub fn get() -> Version {
37        let mut major = MaybeUninit::uninit();
38        let mut minor = MaybeUninit::uninit();
39        let mut micro = MaybeUninit::uninit();
40
41        unsafe {
42            ffi::fluid_version(major.as_mut_ptr(), minor.as_mut_ptr(), micro.as_mut_ptr());
43        }
44
45        Version::new(
46            unsafe { major.assume_init() as _ },
47            unsafe { minor.assume_init() as _ },
48            unsafe { micro.assume_init() as _ },
49        )
50    }
51}
52
53#[cfg(test)]
54mod test {
55    use crate::Version;
56
57    #[test]
58    fn version() {
59        let ver = Version::get();
60
61        assert_eq!(ver, Version::new(1, 2, 1));
62        assert_eq!(ver.to_string(), "1.2.1");
63    }
64}