Skip to main content

aro_core/
error.rs

1//! Repository error types.
2
3use std::error::Error;
4
5/// Errors that can occur in repository operations.
6#[derive(Debug, thiserror::Error)]
7pub enum RepoError {
8    /// The requested entity was not found.
9    #[error("entity not found")]
10    NotFound,
11
12    /// A conflicting entity already exists (e.g. duplicate unique key).
13    #[error("entity conflict")]
14    Conflict,
15
16    /// A validation rule was violated.
17    #[error("validation error: {0}")]
18    ValidationError(String),
19
20    /// An unexpected error occurred.
21    #[error("unknown error: {0}")]
22    Unknown(Box<dyn Error + Send + Sync>),
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn not_found_displays_message() {
31        let err = RepoError::NotFound;
32        assert_eq!(err.to_string(), "entity not found");
33    }
34
35    #[test]
36    fn conflict_displays_message() {
37        let err = RepoError::Conflict;
38        assert_eq!(err.to_string(), "entity conflict");
39    }
40
41    #[test]
42    fn validation_displays_message() {
43        let err = RepoError::ValidationError("name is required".to_string());
44        assert_eq!(err.to_string(), "validation error: name is required");
45    }
46
47    #[test]
48    fn unknown_displays_inner_error() {
49        let inner = std::io::Error::other("disk failure");
50        let err = RepoError::Unknown(Box::new(inner));
51        assert_eq!(err.to_string(), "unknown error: disk failure");
52    }
53
54    #[test]
55    fn repo_error_is_send() {
56        fn assert_send<T: Send>() {}
57        assert_send::<RepoError>();
58    }
59
60    #[test]
61    fn error_trait_is_implemented() {
62        let err: Box<dyn Error> = Box::new(RepoError::NotFound);
63        assert_eq!(err.to_string(), "entity not found");
64    }
65}