Skip to main content

noxu_tree/
error.rs

1//! Error types for the noxu-tree crate.
2//!
3
4use thiserror::Error;
5
6/// Errors that can occur during tree operations.
7#[derive(Error, Debug)]
8pub enum TreeError {
9    /// Attempted to delete/remove a non-empty node.
10    ///
11    /// .
12    #[error("Node is not empty and cannot be deleted")]
13    NodeNotEmpty,
14
15    /// Attempted to remove a node that still has cursors positioned on it.
16    ///
17    /// .
18    #[error("Cursors exist on node and it cannot be removed")]
19    CursorsExist,
20
21    /// Attempted an operation that requires a node split.
22    ///
23    /// .
24    #[error("Node split is required")]
25    SplitRequired,
26
27    /// Key was not found in the tree.
28    #[error("Key not found")]
29    KeyNotFound,
30
31    /// Invalid tree level specified.
32    #[error("Invalid tree level: {level}")]
33    InvalidLevel { level: i32 },
34
35    /// I/O error occurred.
36    #[error("I/O error: {0}")]
37    Io(String),
38
39    /// Log error occurred.
40    #[error("Log error: {0}")]
41    LogError(String),
42}
43
44/// Type alias for tree operation results.
45pub 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        // All should be displayable
83        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}