openzeppelin_relayer/models/error/
repository.rs1use thiserror::Error;
2
3use crate::models::ApiError;
4
5#[derive(Debug, Error)]
6pub enum RepositoryError {
7 #[error("Entity not found: {0}")]
8 NotFound(String),
9
10 #[error("Entity already exists: {0}")]
11 LockError(String),
12
13 #[error("Failed to connect to the database: {0}")]
14 ConnectionError(String),
15
16 #[error("Constraint violated: {0}")]
17 ConstraintViolation(String),
18
19 #[error("Invalid data: {0}")]
20 InvalidData(String),
21
22 #[error("Transaction failure: {0}")]
23 TransactionFailure(String),
24
25 #[error("Concurrent update conflict: {0}")]
26 ConcurrentUpdateConflict(String),
27
28 #[error("Transaction validation failed: {0}")]
29 TransactionValidationFailed(String),
30
31 #[error("Permission denied: {0}")]
32 PermissionDenied(String),
33
34 #[error("An unknown error occurred: {0}")]
35 Unknown(String),
36
37 #[error("Not supported: {0}")]
38 NotSupported(String),
39
40 #[error("Unexpected error: {0}")]
41 UnexpectedError(String),
42
43 #[error("Other error: {0}")]
44 Other(String),
45}
46
47impl From<RepositoryError> for ApiError {
48 fn from(error: RepositoryError) -> Self {
49 match error {
50 RepositoryError::NotFound(msg) => ApiError::NotFound(msg),
51 RepositoryError::Unknown(msg) => ApiError::InternalError(msg),
52 _ => ApiError::InternalError("An unknown error occurred".to_string()),
53 }
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_repository_error_to_api_error_not_found() {
63 let repo_error = RepositoryError::NotFound("User not found".to_string());
64 let api_error = ApiError::from(repo_error);
65
66 match api_error {
67 ApiError::NotFound(msg) => assert_eq!(msg, "User not found"),
68 _ => panic!("Expected ApiError::NotFound, got something else"),
69 }
70 }
71
72 #[test]
73 fn test_repository_error_to_api_error_unknown() {
74 let repo_error = RepositoryError::Unknown("Database error".to_string());
75 let api_error = ApiError::from(repo_error);
76
77 match api_error {
78 ApiError::InternalError(msg) => assert_eq!(msg, "Database error"),
79 _ => panic!("Expected ApiError::InternalError, got something else"),
80 }
81 }
82
83 #[test]
84 fn test_repository_error_to_api_error_other_errors() {
85 let test_cases = vec![
86 RepositoryError::LockError("Lock error".to_string()),
87 RepositoryError::ConnectionError("Connection error".to_string()),
88 RepositoryError::ConstraintViolation("Constraint error".to_string()),
89 RepositoryError::InvalidData("Invalid data".to_string()),
90 RepositoryError::TransactionFailure("Transaction failed".to_string()),
91 RepositoryError::ConcurrentUpdateConflict("Concurrent conflict".to_string()),
92 RepositoryError::TransactionValidationFailed("Validation failed".to_string()),
93 RepositoryError::PermissionDenied("Permission denied".to_string()),
94 RepositoryError::NotSupported("Not supported".to_string()),
95 ];
96
97 for repo_error in test_cases {
98 let api_error = ApiError::from(repo_error);
99
100 match api_error {
101 ApiError::InternalError(msg) => assert_eq!(msg, "An unknown error occurred"),
102 _ => panic!("Expected ApiError::InternalError, got something else"),
103 }
104 }
105 }
106}