openzeppelin_relayer/models/error/
signer.rs1use serde::Serialize;
2use thiserror::Error;
3
4use crate::services::{AwsKmsError, GoogleCloudKmsError, TurnkeyError, VaultError};
5
6use super::TransactionError;
7
8#[derive(Error, Debug, Serialize)]
9#[allow(clippy::enum_variant_names)]
10pub enum SignerError {
11 #[error("Failed to sign transaction: {0}")]
12 SigningError(String),
13
14 #[error("Invalid key format: {0}")]
15 KeyError(String),
16
17 #[error("Provider error: {0}")]
18 ProviderError(String),
19
20 #[error("Unsupported signer type: {0}")]
21 UnsupportedTypeError(String),
22
23 #[error("Invalid transaction: {0}")]
24 InvalidTransaction(#[from] TransactionError),
25
26 #[error("Vault error: {0}")]
27 VaultError(#[from] VaultError),
28
29 #[error("Turnkey error: {0}")]
30 TurnkeyError(#[from] TurnkeyError),
31
32 #[error("AWS KMS error: {0}")]
33 AwsKmsError(#[from] AwsKmsError),
34
35 #[error("Google Cloud KMS error: {0}")]
36 GoogleCloudKmsError(#[from] GoogleCloudKmsError),
37
38 #[error("Not implemented: {0}")]
39 NotImplemented(String),
40
41 #[error("Invalid configuration: {0}")]
42 ConfigError(String),
43
44 #[error("Network error: {0}")]
45 NetworkError(String),
46
47 #[error("Authentication error: {0}")]
48 AuthenticationError(String),
49
50 #[error("Parse error: {0}")]
51 ParseError(String),
52
53 #[error("Invalid configuration: {0}")]
54 Configuration(String),
55
56 #[error("Transaction conversion error: {0}")]
57 ConversionError(String),
58}
59
60#[derive(Error, Debug, Serialize)]
61pub enum SignerFactoryError {
62 #[error("Invalid configuration: {0}")]
63 InvalidConfig(String),
64 #[error("Signer creation failed: {0}")]
65 CreationFailed(String),
66 #[error("Unsupported signer type: {0}")]
67 UnsupportedType(String),
68 #[error("Signer error: {0}")]
69 SignerError(#[from] SignerError),
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75
76 #[test]
77 fn test_signer_error_display() {
78 let test_cases = vec![
79 (
80 SignerError::SigningError("failed to sign".to_string()),
81 "Failed to sign transaction: failed to sign",
82 ),
83 (
84 SignerError::KeyError("invalid key".to_string()),
85 "Invalid key format: invalid key",
86 ),
87 (
88 SignerError::ProviderError("connection failed".to_string()),
89 "Provider error: connection failed",
90 ),
91 (
92 SignerError::UnsupportedTypeError("unknown type".to_string()),
93 "Unsupported signer type: unknown type",
94 ),
95 (
96 SignerError::NotImplemented("feature not ready".to_string()),
97 "Not implemented: feature not ready",
98 ),
99 (
100 SignerError::Configuration("missing parameter".to_string()),
101 "Invalid configuration: missing parameter",
102 ),
103 (
104 SignerError::ConversionError("conversion failed".to_string()),
105 "Transaction conversion error: conversion failed",
106 ),
107 ];
108
109 for (error, expected_message) in test_cases {
110 assert_eq!(error.to_string(), expected_message);
111 }
112 }
113
114 #[test]
115 fn test_signer_error_from_transaction_error() {
116 let tx_error = TransactionError::ValidationError("bad format".to_string());
117 let signer_error = SignerError::from(tx_error);
118
119 match signer_error {
120 SignerError::InvalidTransaction(e) => {
121 assert_eq!(e.to_string(), "Transaction validation error: bad format");
122 }
123 _ => panic!("Expected SignerError::InvalidTransaction"),
124 }
125 }
126
127 #[test]
128 fn test_signer_error_from_vault_error() {
129 let vault_error = VaultError::AuthenticationFailed("no permission".to_string());
130 let signer_error = SignerError::from(vault_error);
131
132 match signer_error {
133 SignerError::VaultError(e) => {
134 assert_eq!(e.to_string(), "Authentication failed: no permission");
135 }
136 _ => panic!("Expected SignerError::VaultError"),
137 }
138 }
139
140 #[test]
141 fn test_signer_error_from_google_cloud_kms_error() {
142 let gcp_error = GoogleCloudKmsError::ApiError("authentication failed".to_string());
143 let signer_error = SignerError::from(gcp_error);
144
145 match signer_error {
146 SignerError::GoogleCloudKmsError(e) => {
147 assert_eq!(e.to_string(), "KMS API error: authentication failed");
148 }
149 _ => panic!("Expected SignerError::GoogleCloudKmsError"),
150 }
151 }
152
153 #[test]
154 fn test_signer_error_from_turnkey_error() {
155 let turnkey_error = TurnkeyError::AuthenticationFailed("api failure".to_string());
156 let signer_error = SignerError::from(turnkey_error);
157
158 match signer_error {
159 SignerError::TurnkeyError(e) => {
160 assert_eq!(e.to_string(), "Authentication failed: api failure");
161 }
162 _ => panic!("Expected SignerError::TurnkeyError"),
163 }
164 }
165
166 #[test]
167 fn test_signer_error_from_aws_kms_error() {
168 let aws_error = AwsKmsError::ConfigError("invalid credentials".to_string());
169 let signer_error = SignerError::from(aws_error);
170
171 match signer_error {
172 SignerError::AwsKmsError(e) => {
173 assert_eq!(e.to_string(), "AWS KMS config error: invalid credentials");
174 }
175 _ => panic!("Expected SignerError::AwsKmsError"),
176 }
177 }
178
179 #[test]
180 fn test_signer_factory_error_display() {
181 let test_cases = vec![
182 (
183 SignerFactoryError::InvalidConfig("missing key".to_string()),
184 "Invalid configuration: missing key",
185 ),
186 (
187 SignerFactoryError::CreationFailed("initialization error".to_string()),
188 "Signer creation failed: initialization error",
189 ),
190 (
191 SignerFactoryError::UnsupportedType("unknown signer".to_string()),
192 "Unsupported signer type: unknown signer",
193 ),
194 ];
195
196 for (error, expected_message) in test_cases {
197 assert_eq!(error.to_string(), expected_message);
198 }
199 }
200
201 #[test]
202 fn test_signer_factory_error_from_signer_error() {
203 let signer_error = SignerError::KeyError("invalid key format".to_string());
204 let factory_error = SignerFactoryError::from(signer_error);
205
206 match factory_error {
207 SignerFactoryError::SignerError(e) => {
208 assert_eq!(e.to_string(), "Invalid key format: invalid key format");
209 }
210 _ => panic!("Expected SignerFactoryError::SignerError"),
211 }
212 }
213}