use crate::parser::{ByteOrder, Format, Parser};
use crate::{Error, Head};
use alloc::string::String;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Usb {
pub port: u8,
pub interface: u8,
}
impl<'a> TryFrom<Head<'a>> for Usb {
type Error = Error;
fn try_from(mut node: Head<'a>) -> Result<Self, Self::Error> {
Ok(Self {
port: node.data.parse(())?,
interface: node.data.finish(())?,
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct UsbClass {
pub vid: u16,
pub pid: u16,
pub class: u8,
pub subclass: u8,
pub protocol: u8,
}
impl<'a> TryFrom<Head<'a>> for UsbClass {
type Error = Error;
fn try_from(mut node: Head<'a>) -> Result<Self, Self::Error> {
Ok(Self {
vid: node.data.parse(ByteOrder::Little)?,
pid: node.data.parse(ByteOrder::Little)?,
class: node.data.parse(())?,
subclass: node.data.parse(())?,
protocol: node.data.finish(())?,
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct UsbWwid {
pub interface: u16,
pub vid: u16,
pub pid: u16,
pub serial: String,
}
impl<'a> TryFrom<Head<'a>> for UsbWwid {
type Error = Error;
fn try_from(mut node: Head<'a>) -> Result<Self, Self::Error> {
Ok(Self {
interface: node.data.parse(ByteOrder::Little)?,
vid: node.data.parse(ByteOrder::Little)?,
pid: node.data.parse(ByteOrder::Little)?,
serial: node.data.finish(Format::Utf16(Some(node.data.len())))?,
})
}
}