blob: fb624e6c9dbec5ecb72181749e4059c621d9f1d8 [file] [log] [blame]
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 }
}