| 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 } | |
| } |