use std::fmt;
use crate::errors::{DBIOError, LogIOError};
use crate::tables;
use super::version::SeekChargeMetadata;
pub(crate) type ReadResult<T> = Result<T, ReadError>;
pub type WriteResult<T> = Result<T, WriteError>;
pub type RecoverResult<T> = Result<T, RecoverError>;
#[derive(Clone, Debug)]
pub(crate) enum ReadError {
TableRead((tables::errors::ReadError, Option<SeekChargeMetadata>)),
}
impl std::error::Error for ReadError {}
impl fmt::Display for ReadError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ReadError::TableRead((base_err, _)) => {
write!(
f,
"The key was not found in this version. Table read error: {}",
base_err
)
}
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum WriteError {
ManifestWrite(ManifestWriteErrorKind),
}
impl std::error::Error for WriteError {}
impl fmt::Display for WriteError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
WriteError::ManifestWrite(base_err) => write!(f, "{:?}", base_err),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ManifestWriteErrorKind {
LogIO(LogIOError),
SwapCurrentFile(DBIOError),
ManifestErrorCleanup(DBIOError),
}
impl From<LogIOError> for WriteError {
fn from(err: LogIOError) -> Self {
WriteError::ManifestWrite(ManifestWriteErrorKind::LogIO(err))
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RecoverError {
CurrentFileRead(CurrentFileReadErrorKind),
ManifestRead(LogIOError),
ManifestParse(String),
ManifestCorruption(String),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum CurrentFileReadErrorKind {
IO(DBIOError),
Parse(String),
}
impl std::error::Error for RecoverError {}
impl fmt::Display for RecoverError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RecoverError::CurrentFileRead(base_err) => {
write!(f, "{base_err:?}", base_err = base_err)
}
RecoverError::ManifestRead(base_err) => {
write!(f, "{base_err}", base_err = base_err)
}
RecoverError::ManifestParse(base_err) => {
write!(
f,
"There was an error parsing the manifest record read from disk. Error: \
{base_err}",
base_err = base_err
)
}
RecoverError::ManifestCorruption(base_err) => {
write!(f, "{base_err}", base_err = base_err)
}
}
}
}