use std::fmt;
use std::io;
#[derive(Debug, PartialEq, Eq)]
pub enum FluxError {
SerializationConflict,
TransactionAlreadyActive,
NoActiveTransaction,
SavepointNotFound(String),
Persistence(PersistenceError),
EvictionError,
Configuration(String),
MemoryLimitExceeded,
FatalPersistenceError(String),
}
#[derive(Debug, PartialEq, Eq)]
pub enum PersistenceError {
Io(String),
Serialization(String),
Recovery(String),
}
impl fmt::Display for PersistenceError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PersistenceError::Io(e) => write!(f, "I/O error: {}", e),
PersistenceError::Serialization(e) => write!(f, "Serialization error: {}", e),
PersistenceError::Recovery(e) => write!(f, "Recovery error: {}", e),
}
}
}
impl std::error::Error for PersistenceError {}
impl fmt::Display for FluxError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FluxError::SerializationConflict => {
write!(f, "Serialization conflict: transaction aborted")
}
FluxError::TransactionAlreadyActive => {
write!(f, "A transaction is already active on this handle")
}
FluxError::NoActiveTransaction => {
write!(f, "No active transaction on this handle")
}
FluxError::SavepointNotFound(name) => {
write!(f, "Savepoint '{}' not found in active transaction", name)
}
FluxError::Persistence(e) => write!(f, "Persistence error: {}", e),
FluxError::EvictionError => write!(f, "Eviction error: could not find or evict a key"),
FluxError::MemoryLimitExceeded => {
write!(f, "Memory limit exceeded, manual eviction required")
}
FluxError::Configuration(e) => write!(f, "Configuration error: {}", e),
FluxError::FatalPersistenceError(e) => {
write!(
f,
"Fatal persistence error: {}. The database is in a terminal state.",
e
)
}
}
}
}
impl std::error::Error for FluxError {}
impl From<io::Error> for FluxError {
fn from(err: io::Error) -> Self {
FluxError::Persistence(PersistenceError::Io(err.to_string()))
}
}