#![allow(dead_code)]
use crate::{enumerators, PciDevice, PciDeviceEnumerationError, PciEnumerator, PciInfoError};
pub struct PciInfo {
pub(crate) results: Vec<Result<PciDevice, PciDeviceEnumerationError>>,
}
impl PciInfo {
pub(crate) fn empty() -> Self {
Self {
results: Vec::new(),
}
}
pub(crate) fn push_device(&mut self, dev: PciDevice) {
self.results.push(Ok(dev));
}
pub(crate) fn push_error(&mut self, err: PciDeviceEnumerationError) {
self.results.push(Err(err));
}
pub fn enumerate_pci() -> Result<Self, PciInfoError> {
Self::enumerate_pci_with_enumerator(enumerators::default_pci_enumerator()?)
}
pub fn enumerate_pci_with_enumerator<T: PciEnumerator>(
enumerator: T,
) -> Result<Self, PciInfoError> {
enumerator.enumerate_pci()
}
pub fn iter(&self) -> PciInfoRefIterator {
PciInfoRefIterator {
pci_info: self,
index: 0,
}
}
pub(crate) fn find_device_mut(
&mut self,
location: crate::PciLocation,
) -> Option<&mut PciDevice> {
for r in self.results.iter_mut().flatten() {
if let Some(loc) = r.properties.location.as_option() {
if *loc == location {
return Some(r);
}
}
}
None
}
pub(crate) fn mutate_devices<F: FnMut(&mut PciDevice)>(&mut self, mut mutator: F) {
for r in self.results.iter_mut().flatten() {
mutator(r);
}
}
}
impl<'a> IntoIterator for &'a PciInfo {
type Item = Result<&'a PciDevice, &'a PciDeviceEnumerationError>;
type IntoIter = PciInfoRefIterator<'a>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl IntoIterator for PciInfo {
type Item = Result<PciDevice, PciDeviceEnumerationError>;
type IntoIter = <Vec<Result<PciDevice, PciDeviceEnumerationError>> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.results.into_iter()
}
}
pub struct PciInfoRefIterator<'a> {
pci_info: &'a PciInfo,
index: usize,
}
impl<'a> Iterator for PciInfoRefIterator<'a> {
type Item = Result<&'a PciDevice, &'a PciDeviceEnumerationError>;
fn next(&mut self) -> Option<Self::Item> {
if self.index >= self.pci_info.results.len() {
None
} else {
let item = match &self.pci_info.results[self.index] {
Ok(v) => Ok(v),
Err(e) => Err(e),
};
self.index += 1;
Some(item)
}
}
}