| use std::{ffi::CStr, fmt, str}; |
| |
| use libusb1_sys::{libusb_get_version, libusb_version}; |
| |
| /// A structure that describes the version of the underlying `libusb` library. |
| pub struct LibraryVersion { |
| inner: &'static libusb_version, |
| } |
| |
| impl LibraryVersion { |
| /// Library major version. |
| pub fn major(&self) -> u16 { |
| self.inner.major |
| } |
| |
| /// Library minor version. |
| pub fn minor(&self) -> u16 { |
| self.inner.minor |
| } |
| |
| /// Library micro version. |
| pub fn micro(&self) -> u16 { |
| self.inner.micro |
| } |
| |
| /// Library nano version. |
| pub fn nano(&self) -> u16 { |
| self.inner.nano |
| } |
| |
| /// Library release candidate suffix string, e.g., `"-rc4"`. |
| pub fn rc(&self) -> Option<&'static str> { |
| let cstr = unsafe { CStr::from_ptr(self.inner.rc) }; |
| |
| match str::from_utf8(cstr.to_bytes()) { |
| Ok(s) => { |
| if s.is_empty() { |
| None |
| } else { |
| Some(s) |
| } |
| } |
| Err(_) => None, |
| } |
| } |
| } |
| |
| impl fmt::Debug for LibraryVersion { |
| fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> { |
| let mut debug = fmt.debug_struct("LibraryVersion"); |
| |
| debug.field("major", &self.major()); |
| debug.field("minor", &self.minor()); |
| debug.field("micro", &self.micro()); |
| debug.field("nano", &self.nano()); |
| debug.field("rc", &self.rc()); |
| |
| debug.finish() |
| } |
| } |
| |
| /// Returns a structure with the version of the running libusb library. |
| pub fn version() -> LibraryVersion { |
| let version: &'static libusb_version = unsafe { &*libusb_get_version() }; |
| |
| LibraryVersion { inner: version } |
| } |