Skip to main content

smos_application/errors/
repo_error.rs

1//! Persistence-layer errors.
2//!
3//! Returned by `FactRepository` / `SessionRepository` implementations. Each
4//! variant maps to a distinct recovery strategy: serialization errors are
5//! caller bugs, transaction conflicts are retryable, connect failures are
6//! infrastructure.
7
8use thiserror::Error;
9
10/// Errors returned by storage adapters (currently the SurrealDB adapter).
11#[derive(Debug, Error)]
12pub enum RepoError {
13    #[error("surrealdb connect failed: {0}")]
14    ConnectFailed(String),
15
16    #[error("surrealdb query failed: {0}")]
17    QueryFailed(String),
18
19    #[error("surrealdb serialization failed: {0}")]
20    SerializationFailed(String),
21
22    #[error("surrealdb transaction conflict")]
23    TransactionConflict,
24
25    #[error("vector dimension mismatch: expected {expected}, got {actual}")]
26    VectorDimensionMismatch { expected: usize, actual: usize },
27
28    #[error("record not found: {0}")]
29    NotFound(String),
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn display_includes_inner_message() {
38        let e = RepoError::QueryFailed("syntax error near 'FOO'".into());
39        assert!(e.to_string().contains("syntax error near 'FOO'"));
40    }
41
42    #[test]
43    fn transaction_conflict_display_is_stable() {
44        assert_eq!(
45            RepoError::TransactionConflict.to_string(),
46            "surrealdb transaction conflict"
47        );
48    }
49
50    #[test]
51    fn vector_dimension_mismatch_display_shows_both_sides() {
52        let e = RepoError::VectorDimensionMismatch {
53            expected: 1024,
54            actual: 768,
55        };
56        let msg = e.to_string();
57        assert!(msg.contains("1024") && msg.contains("768"));
58    }
59}