usbapi/os/linux/
enumerate.rs1use crate::UsbDevice;
2use std::collections::HashMap;
3use std::convert::{TryFrom, TryInto};
4use std::io::{Error, ErrorKind};
5use sysfs_serde::{SysFs, UsbDevices};
6
7impl TryFrom<UsbDevices> for UsbEnumerate {
8 type Error = std::io::Error;
9 fn try_from(sysfs: UsbDevices) -> Result<Self, Self::Error> {
10 let mut en = Self::default();
11 for dev in sysfs.values() {
12 let dev = UsbDevice::from_bytes(dev.descriptors.clone(), |mut d| {
13 d.product = dev.product.clone();
14 d.manufacturer = dev.manufacturer.clone();
15 d.serial = dev.serial.clone();
16 d.bus_num = dev.bus_num;
17 d.dev_num = dev.dev_num;
18 })?;
19 en.devices
20 .insert(format!("{}-{}", dev.bus_num, dev.dev_num), dev);
21 }
22 Ok(en)
23 }
24}
25
26#[derive(Default)]
27pub struct UsbEnumerate {
28 pub devices: HashMap<String, UsbDevice>,
29}
30
31impl UsbEnumerate {
32 pub fn from_sysfs() -> std::io::Result<Self> {
33 SysFs::usb_devices()
34 .map_err(|e| Error::new(ErrorKind::Other, e))?
35 .try_into()
36 }
37
38 pub fn devices(&self) -> &HashMap<String, UsbDevice> {
39 &self.devices
40 }
41
42 pub fn get_device_from_bus(&self, bus: u8, address: u8) -> Option<&UsbDevice> {
43 self.devices.get(&format!("{}-{}", bus, address))
44 }
45}