use std::fmt;
use crate::VkResult;
#[derive(Debug)]
pub enum IcdError {
InvalidString(std::ffi::NulError),
LibraryLoadFailed(String),
MissingFunction(&'static str),
InvalidManifest(String),
NoManifestsFound,
MutexPoisoned,
InvalidPath(String),
VulkanError(VkResult),
InvalidOperation(&'static str),
NoIcdLoaded,
}
impl fmt::Display for IcdError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
IcdError::InvalidString(e) => write!(f, "Invalid string: {}", e),
IcdError::LibraryLoadFailed(path) => write!(f, "Failed to load library: {}", path),
IcdError::MissingFunction(name) => write!(f, "Missing function: {}", name),
IcdError::InvalidManifest(msg) => write!(f, "Invalid manifest: {}", msg),
IcdError::NoManifestsFound => write!(f, "No ICD manifest files found"),
IcdError::MutexPoisoned => write!(f, "Mutex was poisoned"),
IcdError::InvalidPath(path) => write!(f, "Invalid path: {}", path),
IcdError::VulkanError(result) => write!(f, "Vulkan error: {:?}", result),
IcdError::InvalidOperation(op) => write!(f, "Invalid operation: {}", op),
IcdError::NoIcdLoaded => write!(f, "No ICD loaded"),
}
}
}
impl std::error::Error for IcdError {}
impl From<std::ffi::NulError> for IcdError {
fn from(e: std::ffi::NulError) -> Self {
IcdError::InvalidString(e)
}
}
#[derive(Debug)]
pub enum KronosError {
IcdError(IcdError),
MutexPoisoned,
}
impl fmt::Display for KronosError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
KronosError::IcdError(e) => write!(f, "ICD error: {}", e),
KronosError::MutexPoisoned => write!(f, "Mutex was poisoned"),
}
}
}
impl std::error::Error for KronosError {}
impl From<IcdError> for KronosError {
fn from(e: IcdError) -> Self {
KronosError::IcdError(e)
}
}
impl<T> From<std::sync::PoisonError<T>> for IcdError {
fn from(_: std::sync::PoisonError<T>) -> Self {
IcdError::MutexPoisoned
}
}
impl<T> From<std::sync::PoisonError<T>> for KronosError {
fn from(_: std::sync::PoisonError<T>) -> Self {
KronosError::MutexPoisoned
}
}