use std::fmt;
use std::io;
use windows_sys::Win32::Foundation::{
IORING_E_COMPLETION_QUEUE_TOO_BIG, IORING_E_COMPLETION_QUEUE_TOO_FULL, IORING_E_CORRUPT,
IORING_E_REQUIRED_FLAG_NOT_SUPPORTED, IORING_E_SUBMISSION_QUEUE_FULL,
IORING_E_SUBMISSION_QUEUE_TOO_BIG, IORING_E_SUBMIT_IN_PROGRESS, IORING_E_VERSION_NOT_SUPPORTED,
};
use windows_sys::core::HRESULT;
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct IoRingError {
code: HRESULT,
}
impl IoRingError {
pub(crate) fn new(code: HRESULT) -> Self {
Self { code }
}
#[must_use]
pub fn code(&self) -> HRESULT {
self.code
}
#[must_use]
pub fn name(&self) -> Option<&'static str> {
match self.code {
IORING_E_REQUIRED_FLAG_NOT_SUPPORTED => Some("IORING_E_REQUIRED_FLAG_NOT_SUPPORTED"),
IORING_E_VERSION_NOT_SUPPORTED => Some("IORING_E_VERSION_NOT_SUPPORTED"),
IORING_E_SUBMISSION_QUEUE_FULL => Some("IORING_E_SUBMISSION_QUEUE_FULL"),
IORING_E_SUBMISSION_QUEUE_TOO_BIG => Some("IORING_E_SUBMISSION_QUEUE_TOO_BIG"),
IORING_E_COMPLETION_QUEUE_TOO_BIG => Some("IORING_E_COMPLETION_QUEUE_TOO_BIG"),
IORING_E_CORRUPT => Some("IORING_E_CORRUPT"),
IORING_E_SUBMIT_IN_PROGRESS => Some("IORING_E_SUBMIT_IN_PROGRESS"),
IORING_E_COMPLETION_QUEUE_TOO_FULL => Some("IORING_E_COMPLETION_QUEUE_TOO_FULL"),
_ => None,
}
}
}
impl fmt::Debug for IoRingError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("IoRingError")
.field("code", &format_args!("0x{:08X}", self.code as u32))
.finish()
}
}
impl fmt::Display for IoRingError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.name() {
Some(name) => write!(f, "{name} (HRESULT 0x{:08X})", self.code as u32),
None => write!(f, "HRESULT 0x{:08X}", self.code as u32),
}
}
}
impl std::error::Error for IoRingError {}
pub(crate) fn check(hr: HRESULT) -> io::Result<()> {
if hr < 0 {
Err(io::Error::other(IoRingError::new(hr)))
} else {
Ok(())
}
}
#[cfg(test)]
mod tests;