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("Transaction validation failed: {0}")]
26 TransactionValidationFailed(String),
27
28 #[error("Permission denied: {0}")]
29 PermissionDenied(String),
30
31 #[error("An unknown error occurred: {0}")]
32 Unknown(String),
33
34 #[error("Not supported: {0}")]
35 NotSupported(String),
36
37 #[error("Unexpected error: {0}")]
38 UnexpectedError(String),
39
40 #[error("Other error: {0}")]
41 Other(String),
42}
43
44impl From<RepositoryError> for ApiError {
45 fn from(error: RepositoryError) -> Self {
46 match error {
47 RepositoryError::NotFound(msg) => ApiError::NotFound(msg),
48 RepositoryError::Unknown(msg) => ApiError::InternalError(msg),
49 _ => ApiError::InternalError("An unknown error occurred".to_string()),
50 }
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn test_repository_error_to_api_error_not_found() {
60 let repo_error = RepositoryError::NotFound("User not found".to_string());
61 let api_error = ApiError::from(repo_error);
62
63 match api_error {
64 ApiError::NotFound(msg) => assert_eq!(msg, "User not found"),
65 _ => panic!("Expected ApiError::NotFound, got something else"),
66 }
67 }
68
69 #[test]
70 fn test_repository_error_to_api_error_unknown() {
71 let repo_error = RepositoryError::Unknown("Database error".to_string());
72 let api_error = ApiError::from(repo_error);
73
74 match api_error {
75 ApiError::InternalError(msg) => assert_eq!(msg, "Database error"),
76 _ => panic!("Expected ApiError::InternalError, got something else"),
77 }
78 }
79
80 #[test]
81 fn test_repository_error_to_api_error_other_errors() {
82 let test_cases = vec![
83 RepositoryError::LockError("Lock error".to_string()),
84 RepositoryError::ConnectionError("Connection error".to_string()),
85 RepositoryError::ConstraintViolation("Constraint error".to_string()),
86 RepositoryError::InvalidData("Invalid data".to_string()),
87 RepositoryError::TransactionFailure("Transaction failed".to_string()),
88 RepositoryError::TransactionValidationFailed("Validation failed".to_string()),
89 RepositoryError::PermissionDenied("Permission denied".to_string()),
90 RepositoryError::NotSupported("Not supported".to_string()),
91 ];
92
93 for repo_error in test_cases {
94 let api_error = ApiError::from(repo_error);
95
96 match api_error {
97 ApiError::InternalError(msg) => assert_eq!(msg, "An unknown error occurred"),
98 _ => panic!("Expected ApiError::InternalError, got something else"),
99 }
100 }
101 }
102}