use crate::PciBusNumber;
use crate::PciInfoError;
use crate::PciInfoErrorString;
use crate::PciLocation;
use std::error::Error;
use std::fmt::Debug;
use std::fmt::Display;
#[derive(Copy, Clone, Debug)]
pub enum PciDeviceEnumerationErrorLocation {
None,
Bus(PciBusNumber),
Device(PciLocation),
}
#[derive(Copy, Clone, Debug)]
pub enum PciDeviceEnumerationErrorImpact {
Bus,
Device,
DeviceProperties,
}
#[derive(Debug)]
pub struct PciDeviceEnumerationError {
impact: PciDeviceEnumerationErrorImpact,
error: PciInfoError,
location: PciDeviceEnumerationErrorLocation,
}
impl Display for PciDeviceEnumerationError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let at: PciInfoErrorString = match self.location {
PciDeviceEnumerationErrorLocation::None => "".into(),
PciDeviceEnumerationErrorLocation::Bus(l) => format!(" at {:?} ", l).into(),
PciDeviceEnumerationErrorLocation::Device(l) => format!(" at {:?} ", l).into(),
};
match self.impact {
PciDeviceEnumerationErrorImpact::Bus => {
write!(f, "pci bus enumeration error{}: {}", at, self.error)
}
PciDeviceEnumerationErrorImpact::Device => {
write!(f, "pci device enumeration error{}: {}", at, self.error)
}
PciDeviceEnumerationErrorImpact::DeviceProperties => write!(
f,
"an error might have caused properties to be missing from a pci device{}: {}",
at, self.error
),
}
}
}
impl PciDeviceEnumerationError {
#[allow(dead_code)]
pub(crate) fn new(impact: PciDeviceEnumerationErrorImpact, error: PciInfoError) -> Self {
Self {
impact,
error,
location: PciDeviceEnumerationErrorLocation::None,
}
}
#[allow(dead_code)]
pub(crate) fn new_at_bus(
bus: PciBusNumber,
impact: PciDeviceEnumerationErrorImpact,
error: PciInfoError,
) -> Self {
Self {
impact,
error,
location: PciDeviceEnumerationErrorLocation::Bus(bus),
}
}
#[allow(dead_code)]
pub(crate) fn new_at_device(
loc: PciLocation,
impact: PciDeviceEnumerationErrorImpact,
error: PciInfoError,
) -> Self {
Self {
impact,
error,
location: PciDeviceEnumerationErrorLocation::Device(loc),
}
}
pub fn impact(&self) -> PciDeviceEnumerationErrorImpact {
self.impact
}
pub fn error(&self) -> &PciInfoError {
&self.error
}
pub fn location(&self) -> PciDeviceEnumerationErrorLocation {
self.location
}
}
impl Error for PciDeviceEnumerationError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
Some(self.error())
}
}