use std::fmt::{self, Debug, Display};
use crate::traits::{DeserializationError, SerializationError};
#[derive(Debug)]
pub enum DatabaseError<S: Debug + Display> {
Serialization(SerializationError),
Deserialization(DeserializationError),
Io(S),
Storage(S),
FailedToIncrement,
Internal(InternalDatabaseError),
}
#[derive(Debug)]
pub enum InternalDatabaseError {
InvalidScope,
UnexpectedScopeInIndex,
MissingIndexEntry,
Serialization(SerializationError),
Deserialization(SerializationError),
}
impl<S: Debug + Display + Eq + PartialEq> From<InternalDatabaseError> for DatabaseError<S> {
fn from(e: InternalDatabaseError) -> Self {
DatabaseError::Internal(e)
}
}
impl<S: Debug + Display + Eq + PartialEq> fmt::Display for DatabaseError<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Self::Serialization(ref e) => write!(f, "Serialization error: {e}"),
Self::Deserialization(ref e) => write!(f, "Deserialization error: {e}"),
Self::Io(ref s) => write!(f, "IO error: {s}"),
Self::Storage(ref s) => write!(f, "Storage error: {s}"),
Self::FailedToIncrement => write!(f, "Failed to increment key value"),
Self::Internal(ref e) => write!(f, "Internal database error: {e}"),
}
}
}
impl fmt::Display for InternalDatabaseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Self::InvalidScope => write!(f, "Invalid scope"),
Self::UnexpectedScopeInIndex => write!(f, "Unexpected scope in index"),
Self::MissingIndexEntry => write!(f, "Missing index entry"),
Self::Serialization(ref e) => write!(f, "Serialization error: {e}"),
Self::Deserialization(ref e) => write!(f, "Deserialization error: {e}"),
}
}
}
impl<S: Debug + Display + Eq + PartialEq> From<SerializationError> for DatabaseError<S> {
fn from(e: SerializationError) -> Self {
DatabaseError::Serialization(e)
}
}