1use std::error::Error;
4
5#[derive(Debug, thiserror::Error)]
7pub enum RepoError {
8 #[error("entity not found")]
10 NotFound,
11
12 #[error("entity conflict")]
14 Conflict,
15
16 #[error("validation error: {0}")]
18 ValidationError(String),
19
20 #[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}