use std::fmt;
use super::ModuleId;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ModuleError {
LoadFailed(String),
NoEntryPoint(String),
InitFailed(String),
IncompatibleVersion {
module: (u32, u32),
kernel: (u32, u32),
},
InUse {
module: ModuleId,
by: ModuleId,
},
NotLoaded(ModuleId),
NotFound(String),
}
#[cfg_attr(coverage_nightly, coverage(off))]
impl fmt::Display for ModuleError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::LoadFailed(msg) => write!(f, "failed to load module: {msg}"),
Self::NoEntryPoint(msg) => write!(f, "module missing entry point: {msg}"),
Self::InitFailed(msg) => write!(f, "module initialization failed: {msg}"),
Self::IncompatibleVersion { module, kernel } => {
write!(
f,
"module requires API {}.{}, kernel provides {}.{}",
module.0, module.1, kernel.0, kernel.1
)
}
Self::InUse { module, by } => {
write!(f, "module '{module}' is in use by '{by}'")
}
Self::NotLoaded(id) => write!(f, "module '{id}' is not loaded"),
Self::NotFound(name) => write!(f, "module '{name}' not found"),
}
}
}
impl std::error::Error for ModuleError {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ProbeResult {
Success,
Defer(String),
Failed(ModuleError),
}