use heterob::{bit_numbering::Lsb, endianness::Le, Seq, P2, P4, P5};
use super::ExtendedCapabilityDataError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AlternativeRoutingIdInterpretation {
pub ari_capability: AriCapability,
pub ari_control: AriControl,
}
impl TryFrom<&[u8]> for AlternativeRoutingIdInterpretation {
type Error = ExtendedCapabilityDataError;
fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
let Seq {
head: Le((ari_capability, ari_control)),
..
} = P2(slice)
.try_into()
.map_err(|_| ExtendedCapabilityDataError {
name: "Alternative Routing-ID Interpretation",
size: 4,
})?;
Ok(Self {
ari_capability: From::<u16>::from(ari_capability),
ari_control: From::<u16>::from(ari_control),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AriCapability {
pub mfvc_function_groups_capability: bool,
pub acs_function_groups_capability: bool,
pub next_function_number: u8,
}
impl From<u16> for AriCapability {
fn from(word: u16) -> Self {
let Lsb((
mfvc_function_groups_capability,
acs_function_groups_capability,
(),
next_function_number,
)) = P4::<_, 1, 1, 6, 8>(word).into();
Self {
mfvc_function_groups_capability,
acs_function_groups_capability,
next_function_number,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AriControl {
pub mfvc_function_groups_enable: bool,
pub acs_function_groups_enable: bool,
pub function_group: u8,
}
impl From<u16> for AriControl {
fn from(word: u16) -> Self {
let Lsb((mfvc_function_groups_enable, acs_function_groups_enable, (), function_group, ())) =
P5::<_, 1, 1, 2, 3, 9>(word).into();
Self {
mfvc_function_groups_enable,
acs_function_groups_enable,
function_group,
}
}
}