usbapi/os/linux/
enumerate.rs

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