use thiserror::Error;
#[derive(Error, Debug)]
pub enum TreeError {
#[error("Node is not empty and cannot be deleted")]
NodeNotEmpty,
#[error("Cursors exist on node and it cannot be removed")]
CursorsExist,
#[error("Node split is required")]
SplitRequired,
#[error("Key not found")]
KeyNotFound,
#[error("Invalid tree level: {level}")]
InvalidLevel { level: i32 },
#[error("I/O error: {0}")]
Io(String),
#[error("Log error: {0}")]
LogError(String),
}
pub type TreeResult<T> = Result<T, TreeError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err = TreeError::NodeNotEmpty;
assert_eq!(err.to_string(), "Node is not empty and cannot be deleted");
let err = TreeError::CursorsExist;
assert_eq!(
err.to_string(),
"Cursors exist on node and it cannot be removed"
);
let err = TreeError::InvalidLevel { level: -5 };
assert_eq!(err.to_string(), "Invalid tree level: -5");
}
#[test]
fn test_error_format() {
let err = TreeError::KeyNotFound;
assert_eq!(err.to_string(), "Key not found");
}
#[test]
fn test_error_variants() {
let errors = vec![
TreeError::NodeNotEmpty,
TreeError::CursorsExist,
TreeError::SplitRequired,
TreeError::KeyNotFound,
TreeError::InvalidLevel { level: 42 },
];
for err in errors {
assert!(!err.to_string().is_empty());
}
}
#[test]
fn test_io_error_conversion() {
let tree_err = TreeError::Io("file not found".to_string());
assert!(tree_err.to_string().contains("file not found"));
}
}