Skip to main content

erio_context_store/
error.rs

1//! Error types for the context store.
2
3use thiserror::Error;
4
5/// Errors specific to context store operations.
6#[derive(Debug, Error)]
7pub enum ContextStoreError {
8    #[error("Storage error: {0}")]
9    Storage(String),
10
11    #[error("Embedding error: {0}")]
12    Embedding(String),
13
14    #[error("Invalid input: {0}")]
15    InvalidInput(String),
16
17    #[error("Document not found: {0}")]
18    NotFound(String),
19}
20
21impl ContextStoreError {
22    /// Returns `true` if the error is potentially transient and the operation could be retried.
23    pub fn is_retryable(&self) -> bool {
24        matches!(self, Self::Storage(_))
25    }
26}
27
28impl From<ContextStoreError> for erio_core::CoreError {
29    fn from(err: ContextStoreError) -> Self {
30        Self::ContextStore {
31            message: err.to_string(),
32        }
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    // === Display Tests ===
41
42    #[test]
43    fn storage_error_displays_message() {
44        let err = ContextStoreError::Storage("disk full".into());
45        assert_eq!(err.to_string(), "Storage error: disk full");
46    }
47
48    #[test]
49    fn embedding_error_displays_message() {
50        let err = ContextStoreError::Embedding("inference failed".into());
51        assert_eq!(err.to_string(), "Embedding error: inference failed");
52    }
53
54    #[test]
55    fn invalid_input_displays_message() {
56        let err = ContextStoreError::InvalidInput("empty text".into());
57        assert_eq!(err.to_string(), "Invalid input: empty text");
58    }
59
60    #[test]
61    fn not_found_displays_message() {
62        let err = ContextStoreError::NotFound("doc_123".into());
63        assert_eq!(err.to_string(), "Document not found: doc_123");
64    }
65
66    // === Retryable Tests ===
67
68    #[test]
69    fn storage_error_is_retryable() {
70        let err = ContextStoreError::Storage("timeout".into());
71        assert!(err.is_retryable());
72    }
73
74    #[test]
75    fn embedding_error_is_not_retryable() {
76        let err = ContextStoreError::Embedding("model failed".into());
77        assert!(!err.is_retryable());
78    }
79
80    #[test]
81    fn invalid_input_is_not_retryable() {
82        let err = ContextStoreError::InvalidInput("empty".into());
83        assert!(!err.is_retryable());
84    }
85
86    #[test]
87    fn not_found_is_not_retryable() {
88        let err = ContextStoreError::NotFound("id".into());
89        assert!(!err.is_retryable());
90    }
91
92    // === CoreError Conversion ===
93
94    #[test]
95    fn converts_to_core_error() {
96        let err = ContextStoreError::Storage("test".into());
97        let core_err: erio_core::CoreError = err.into();
98        assert!(matches!(
99            core_err,
100            erio_core::CoreError::ContextStore { .. }
101        ));
102    }
103
104    #[test]
105    fn conversion_preserves_message() {
106        let err = ContextStoreError::InvalidInput("bad input".into());
107        let core_err: erio_core::CoreError = err.into();
108        match core_err {
109            erio_core::CoreError::ContextStore { message } => {
110                assert_eq!(message, "Invalid input: bad input");
111            }
112            _ => panic!("Expected CoreError::ContextStore"),
113        }
114    }
115}