use std::fmt;
use std::io;
#[derive(Debug)]
pub enum Error {
Io(io::Error),
KeyTooLarge(usize),
ValueTooLarge(usize),
FileLocked(String),
Corrupted(String),
InvalidMagic,
UnsupportedVersion(u16),
CorruptHeader(&'static str),
SqlError(String),
ParseError(String),
PlanError(String),
TableNotFound(String),
ColumnNotFound(String),
OutOfMemoryQuota { max_keys: usize },
OutOfStorageQuota { bytes: u64 },
Other(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Io(err) => write!(f, "I/O error: {err}"),
Error::KeyTooLarge(size) => write!(f, "Key too large: {size} bytes (max 1KB)"),
Error::ValueTooLarge(size) => write!(f, "Value too large: {size} bytes (max 256KB)"),
Error::FileLocked(msg) => write!(f, "Database file is locked: {msg}"),
Error::Corrupted(msg) => write!(f, "Database corrupted: {msg}"),
Error::InvalidMagic => write!(f, "Invalid storage file magic header"),
Error::UnsupportedVersion(v) => write!(f, "Unsupported storage file version: {v}"),
Error::CorruptHeader(msg) => write!(f, "Corrupt storage header: {msg}"),
Error::SqlError(msg) => write!(f, "SQL error: {msg}"),
Error::ParseError(msg) => write!(f, "SQL parse error: {msg}"),
Error::PlanError(msg) => write!(f, "Query planning error: {msg}"),
Error::TableNotFound(table) => write!(f, "Table '{table}' not found"),
Error::ColumnNotFound(column) => write!(f, "Column '{column}' not found"),
Error::OutOfMemoryQuota { max_keys } => {
write!(f, "In-memory quota exceeded (max {max_keys} keys)")
}
Error::OutOfStorageQuota { bytes } => {
write!(f, "Storage quota exceeded (max {bytes} bytes)")
}
Error::Other(msg) => write!(f, "Database error: {msg}"),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(err) => Some(err),
_ => None,
}
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error::Io(err)
}
}
impl From<serde_json::Error> for Error {
fn from(err: serde_json::Error) -> Self {
Error::Other(format!("JSON parsing error: {}", err))
}
}
pub type Result<T> = std::result::Result<T, Error>;