1use crate::ffi;
2use std::{
3 fmt::{Display, Formatter, Result as FmtResult},
4 mem::MaybeUninit,
5};
6
7#[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}