usbapi 0.4.2

Access USB from Rust
Documentation
use crate::descriptors::endpoint::Endpoint;
#[cfg(feature = "serde")]
use serde::Serialize;
use std::fmt;
use std::slice::Iter;
#[cfg_attr(feature = "serde", derive(Serialize))]
#[derive(Debug)]
pub struct Interface {
    pub length: u8,
    pub kind: u8,
    pub interface_number: u8,
    pub alternate_setting: u8,
    pub num_endpoints: u8,
    pub interface_class: u8,
    pub interface_sub_class: u8,
    pub interface_protocol: u8,
    pub iinterface: u8,
    pub endpoints: Vec<Endpoint>,
}

impl fmt::Display for Interface {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let mut d = format!("bLength: {}\n", self.length);
        d += &format!("bDescriptorType: {}\n", self.kind);
        d += &format!("bInterfaceNumber: {}\n", self.interface_number);
        d += &format!("bAlternateSetting: {}\n", self.alternate_setting);
        d += &format!("bNumEndpoints: {}\n", self.num_endpoints);
        d += &format!("bInterfaceClass: {}\n", self.interface_class);
        d += &format!("bInterfaceSubClass: {}\n", self.interface_sub_class);
        d += &format!("bInterfaceProtocol: {}\n", self.interface_protocol);
        d += &format!("bInterfaceNumber: {}\n", self.interface_number);
        d += &format!("iInterface: {}\n", self.iinterface);
        for endpoint in &self.endpoints {
            d += &format!("{}", endpoint);
        }
        write!(f, "{}", d)
    }
}

impl Interface {
    pub fn new(iter: &mut Iter<u8>) -> Option<Self> {
        Some(Interface {
            length: *iter.next()?,
            kind: *iter.next()?,
            interface_number: *iter.next()?,
            alternate_setting: *iter.next()?,
            num_endpoints: *iter.next()?,
            interface_class: *iter.next()?,
            interface_sub_class: *iter.next()?,
            interface_protocol: *iter.next()?,
            iinterface: *iter.next()?,
            endpoints: vec![],
        })
    }
}