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