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