Skip to main content

rdif_block/
error.rs

1use crate::io;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum BlkError {
5    NotSupported,
6    Retry,
7    NoMemory,
8    InvalidBlockIndex(u64),
9    InvalidRequest,
10    Io,
11    Other(&'static str),
12}
13
14impl core::fmt::Display for BlkError {
15    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16        match self {
17            BlkError::NotSupported => f.write_str("operation not supported"),
18            BlkError::Retry => f.write_str("operation should be retried"),
19            BlkError::NoMemory => f.write_str("insufficient memory"),
20            BlkError::InvalidBlockIndex(index) => write!(f, "invalid block index: {index}"),
21            BlkError::InvalidRequest => f.write_str("invalid block request"),
22            BlkError::Io => f.write_str("block I/O error"),
23            BlkError::Other(msg) => f.write_str(msg),
24        }
25    }
26}
27
28impl core::error::Error for BlkError {}
29
30impl From<BlkError> for io::ErrorKind {
31    fn from(value: BlkError) -> Self {
32        match value {
33            BlkError::NotSupported => io::ErrorKind::Unsupported,
34            BlkError::Retry => io::ErrorKind::Interrupted,
35            BlkError::NoMemory => io::ErrorKind::OutOfMemory,
36            BlkError::InvalidBlockIndex(_) => io::ErrorKind::NotAvailable,
37            BlkError::InvalidRequest => io::ErrorKind::InvalidParameter {
38                name: "block request",
39            },
40            BlkError::Io => io::ErrorKind::Other("block I/O error".into()),
41            BlkError::Other(msg) => io::ErrorKind::Other(msg.into()),
42        }
43    }
44}
45
46impl From<dma_api::DmaError> for BlkError {
47    fn from(value: dma_api::DmaError) -> Self {
48        match value {
49            dma_api::DmaError::NoMemory => BlkError::NoMemory,
50            _ => BlkError::Io,
51        }
52    }
53}