1use thiserror::Error;
5
6#[derive(Error, Debug)]
8pub enum TreeError {
9 #[error("Node is not empty and cannot be deleted")]
13 NodeNotEmpty,
14
15 #[error("Cursors exist on node and it cannot be removed")]
19 CursorsExist,
20
21 #[error("Node split is required")]
25 SplitRequired,
26
27 #[error("Key not found")]
29 KeyNotFound,
30
31 #[error("Invalid tree level: {level}")]
33 InvalidLevel { level: i32 },
34
35 #[error("I/O error: {0}")]
37 Io(String),
38
39 #[error("Log error: {0}")]
41 LogError(String),
42}
43
44pub type TreeResult<T> = Result<T, TreeError>;
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn test_error_display() {
53 let err = TreeError::NodeNotEmpty;
54 assert_eq!(err.to_string(), "Node is not empty and cannot be deleted");
55
56 let err = TreeError::CursorsExist;
57 assert_eq!(
58 err.to_string(),
59 "Cursors exist on node and it cannot be removed"
60 );
61
62 let err = TreeError::InvalidLevel { level: -5 };
63 assert_eq!(err.to_string(), "Invalid tree level: -5");
64 }
65
66 #[test]
67 fn test_error_format() {
68 let err = TreeError::KeyNotFound;
69 assert_eq!(err.to_string(), "Key not found");
70 }
71
72 #[test]
73 fn test_error_variants() {
74 let errors = vec![
75 TreeError::NodeNotEmpty,
76 TreeError::CursorsExist,
77 TreeError::SplitRequired,
78 TreeError::KeyNotFound,
79 TreeError::InvalidLevel { level: 42 },
80 ];
81
82 for err in errors {
84 assert!(!err.to_string().is_empty());
85 }
86 }
87
88 #[test]
89 fn test_io_error_conversion() {
90 let tree_err = TreeError::Io("file not found".to_string());
91 assert!(tree_err.to_string().contains("file not found"));
92 }
93}