#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Resources<'a>
{
pci_device: &'a PciDevice<'a>,
resources: BTreeMap<u8, ResourceEntry>,
}
impl<'a> Deref for Resources<'a>
{
type Target = BTreeMap<u8, ResourceEntry>;
#[inline(always)]
fn deref(&self) -> &Self::Target
{
&self.resources
}
}
impl<'a> Resources<'a>
{
#[inline(always)]
pub fn memory_map(&self, resource_index: u8) -> Result<Option<MemoryMappedResource>, io::Error>
{
if !self.resources.contains_key(&resource_index)
{
return Ok(None)
}
ResourceEntry::memory_map(self.pci_device, resource_index).map(|resource| Some(resource))
}
pub(crate) fn parse_lines(pci_device: &'a PciDevice<'a>) -> io::Result<Self>
{
let file_path = pci_device.device_file_or_folder_path("resource");
let reader = file_path.read_raw()?;
let mut resources = BTreeMap::default();
let mut index = 0;
for line in reader.split_bytes(b'\n')
{
if let Some(resource_entry) = ResourceEntry::parse_line(line).map_err(io_error_other)?
{
resources.insert(index, resource_entry);
}
index += 1;
}
Ok
(
Self
{
pci_device,
resources,
}
)
}
}