use std::io;
use std::path::PathBuf;
#[derive(Debug)]
pub enum WalError {
Io(io::Error),
InvalidRecordType(u8),
CorruptedRecord(String),
UnexpectedEof,
AlreadyExists,
NotFound,
ParentNotFound(PathBuf),
InvalidRegimeStamp(String),
}
impl std::fmt::Display for WalError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
WalError::Io(e) => write!(f, "WAL I/O error: {}", e),
WalError::InvalidRecordType(t) => write!(f, "Invalid WAL record type: {}", t),
WalError::CorruptedRecord(msg) => write!(f, "Corrupted WAL record: {}", msg),
WalError::UnexpectedEof => write!(f, "Unexpected end of WAL file"),
WalError::AlreadyExists => write!(f, "WAL file already exists"),
WalError::NotFound => write!(f, "WAL file not found"),
WalError::ParentNotFound(path) => {
write!(f, "Parent directory not found: {}", path.display())
}
WalError::InvalidRegimeStamp(msg) => {
write!(f, "Invalid WAL regime stamp: {}", msg)
}
}
}
}
impl std::error::Error for WalError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
WalError::Io(e) => Some(e),
WalError::InvalidRecordType(_)
| WalError::CorruptedRecord(_)
| WalError::UnexpectedEof
| WalError::AlreadyExists
| WalError::NotFound
| WalError::ParentNotFound(_)
| WalError::InvalidRegimeStamp(_) => None,
}
}
}
impl From<io::Error> for WalError {
fn from(err: io::Error) -> Self {
WalError::Io(err)
}
}