use ieee1212_config_rom::*;
#[derive(Default, Debug, Clone, Copy)]
pub struct UnitData {
pub model_id: u32,
pub version: u32,
}
const OUI_MOTU: u32 = 0x0001f2;
pub trait MotuConfigRom {
fn get_unit_data(&self) -> Option<UnitData>;
}
impl<'a> MotuConfigRom for ConfigRom<'a> {
fn get_unit_data(&self) -> Option<UnitData> {
self.root
.iter()
.find_map(|entry| {
EntryDataAccess::<u32>::get(entry, KeyType::Vendor).and_then(|vendor_id| {
if vendor_id == OUI_MOTU {
Some(vendor_id)
} else {
None
}
})
})
.and_then(|_| {
self.root
.iter()
.find_map(|entry| EntryDataAccess::<&[Entry]>::get(entry, KeyType::Unit))
.and_then(|entries| {
entries
.iter()
.find_map(|entry| {
EntryDataAccess::<u32>::get(entry, KeyType::SpecifierId).and_then(
|specifier_id| {
if specifier_id == OUI_MOTU {
Some(specifier_id)
} else {
None
}
},
)
})
.and_then(|_| {
entries
.iter()
.find_map(|entry| {
EntryDataAccess::<u32>::get(entry, KeyType::Version)
})
.and_then(|model_id| {
entries
.iter()
.find_map(|entry| {
EntryDataAccess::<u32>::get(entry, KeyType::Model)
})
.map(|version| UnitData { model_id, version })
})
})
})
})
}
}