use alloc::string::String;
use core::fmt;
#[derive(Debug)]
pub enum BfTreeError {
InvalidKV(String),
NotFound,
Deleted,
InvalidKey,
Config(crate::bf_tree::ConfigError),
Scan(crate::bf_tree::ScanIterError),
Corruption(String),
InvalidOperation(String),
ReservedTableName(String),
InvalidConfig(String),
PartialFlushRollbackFailed {
flush_error: String,
rollback_failures: usize,
last_rollback_error: String,
},
}
impl fmt::Display for BfTreeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidKV(msg) => write!(f, "invalid key/value: {msg}"),
Self::NotFound => write!(f, "key not found"),
Self::Deleted => write!(f, "key deleted"),
Self::InvalidKey => write!(f, "invalid key"),
Self::Config(e) => write!(f, "bf-tree config error: {e:?}"),
Self::Scan(e) => write!(f, "bf-tree scan error: {e:?}"),
Self::Corruption(msg) => write!(f, "data corruption: {msg}"),
Self::InvalidOperation(msg) => write!(f, "invalid operation: {msg}"),
Self::ReservedTableName(name) => write!(
f,
"table name \"{name}\" uses the reserved \"__\" prefix; \
names starting with \"__\" are reserved for internal system tables"
),
Self::InvalidConfig(msg) => write!(f, "invalid configuration: {msg}"),
Self::PartialFlushRollbackFailed {
flush_error,
rollback_failures,
last_rollback_error,
} => write!(
f,
"partial flush rollback failed: original error: {flush_error}; \
rollback had {rollback_failures} failure(s), last: {last_rollback_error}"
),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for BfTreeError {}
impl From<crate::bf_tree::ConfigError> for BfTreeError {
fn from(e: crate::bf_tree::ConfigError) -> Self {
Self::Config(e)
}
}
impl From<crate::bf_tree::BfTreeError> for BfTreeError {
fn from(e: crate::bf_tree::BfTreeError) -> Self {
match e {
crate::bf_tree::BfTreeError::Config(ce) => Self::Config(ce),
crate::bf_tree::BfTreeError::Io(io) => {
Self::Corruption(alloc::format!("bf-tree I/O error: {io}"))
}
}
}
}
impl From<crate::bf_tree::ScanIterError> for BfTreeError {
fn from(e: crate::bf_tree::ScanIterError) -> Self {
Self::Scan(e)
}
}
#[cfg(feature = "std")]
impl From<BfTreeError> for crate::StorageError {
fn from(e: BfTreeError) -> Self {
match e {
BfTreeError::NotFound => crate::StorageError::Corrupted(alloc::string::String::from(
"bf-tree: unexpected missing entry (internal lookup failed)",
)),
BfTreeError::Deleted => crate::StorageError::Corrupted(alloc::string::String::from(
"bf-tree: unexpected tombstone encountered (internal lookup failed)",
)),
BfTreeError::InvalidKV(msg) => {
crate::StorageError::Corrupted(alloc::format!("bf-tree: invalid key/value: {msg}"))
}
BfTreeError::InvalidKey => crate::StorageError::Corrupted(alloc::string::String::from(
"bf-tree: key exceeds maximum length (data inconsistency)",
)),
BfTreeError::Config(e) => {
crate::StorageError::Io(crate::BackendError::Io(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
alloc::format!("bf-tree config error: {e:?}"),
)))
}
BfTreeError::Scan(e) => crate::StorageError::Io(crate::BackendError::Io(
std::io::Error::other(alloc::format!("bf-tree scan error: {e:?}")),
)),
BfTreeError::Corruption(msg) => crate::StorageError::Corrupted(msg),
BfTreeError::InvalidOperation(msg) => {
crate::StorageError::Corrupted(alloc::format!("invalid operation: {msg}"))
}
BfTreeError::ReservedTableName(name) => {
crate::StorageError::Io(crate::BackendError::Io(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
alloc::format!("table name \"{name}\" uses the reserved \"__\" prefix"),
)))
}
BfTreeError::InvalidConfig(msg) => {
crate::StorageError::Io(crate::BackendError::Io(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
alloc::format!("bf-tree invalid config: {msg}"),
)))
}
BfTreeError::PartialFlushRollbackFailed {
flush_error,
rollback_failures,
last_rollback_error,
} => crate::StorageError::Corrupted(alloc::format!(
"bf-tree: partial flush with failed rollback ({rollback_failures} \
rollback failure(s)): original: {flush_error}; last rollback error: \
{last_rollback_error}"
)),
}
}
}
#[cfg(not(feature = "std"))]
impl From<BfTreeError> for crate::StorageError {
fn from(e: BfTreeError) -> Self {
match e {
BfTreeError::NotFound => crate::StorageError::Corrupted(alloc::string::String::from(
"bf-tree: unexpected missing entry (internal lookup failed)",
)),
BfTreeError::Deleted => crate::StorageError::Corrupted(alloc::string::String::from(
"bf-tree: unexpected tombstone encountered (internal lookup failed)",
)),
BfTreeError::InvalidKV(msg) => {
crate::StorageError::Corrupted(alloc::format!("bf-tree: invalid key/value: {msg}"))
}
BfTreeError::InvalidKey => crate::StorageError::Corrupted(alloc::string::String::from(
"bf-tree: key exceeds maximum length (data inconsistency)",
)),
BfTreeError::Config(e) => {
crate::StorageError::Corrupted(alloc::format!("bf-tree config error: {e:?}"))
}
BfTreeError::Scan(e) => {
crate::StorageError::Corrupted(alloc::format!("bf-tree scan error: {e:?}"))
}
BfTreeError::Corruption(msg) => crate::StorageError::Corrupted(msg),
BfTreeError::InvalidOperation(msg) => {
crate::StorageError::Corrupted(alloc::format!("invalid operation: {msg}"))
}
BfTreeError::ReservedTableName(name) => crate::StorageError::Corrupted(alloc::format!(
"table name \"{name}\" uses the reserved \"__\" prefix"
)),
BfTreeError::InvalidConfig(msg) => {
crate::StorageError::Corrupted(alloc::format!("bf-tree invalid config: {msg}"))
}
BfTreeError::PartialFlushRollbackFailed {
flush_error,
rollback_failures,
last_rollback_error,
} => crate::StorageError::Corrupted(alloc::format!(
"bf-tree: partial flush with failed rollback ({rollback_failures} \
rollback failure(s)): original: {flush_error}; last rollback error: \
{last_rollback_error}"
)),
}
}
}