1use thiserror::Error;
2
3#[derive(Debug, Clone, Error)]
5pub enum TokenRefreshError {
6 #[error("Token refresh failed after {attempts} attempts")]
7 MaxRetriesExceeded { attempts: u32 },
8
9 #[error("Network error during token refresh: {reason}")]
10 NetworkError { reason: String },
11
12 #[error("Invalid refresh token")]
13 InvalidRefreshToken,
14
15 #[error("Token refresh not supported by provider")]
16 RefreshNotSupported,
17
18 #[error("Authentication required - refresh token expired")]
19 RefreshTokenExpired,
20
21 #[error("Rate limited by authentication provider")]
22 RateLimited { retry_after_seconds: Option<u64> },
23
24 #[error("Service unavailable: {reason}")]
25 ServiceUnavailable { reason: String },
26
27 #[error("Internal error: {0}")]
28 Internal(String),
29}
30
31impl From<TokenRefreshError> for crate::service_bus_manager::ServiceBusError {
32 fn from(err: TokenRefreshError) -> Self {
33 match err {
34 TokenRefreshError::RefreshTokenExpired | TokenRefreshError::InvalidRefreshToken => {
35 crate::service_bus_manager::ServiceBusError::AuthenticationFailed(err.to_string())
36 }
37 TokenRefreshError::NetworkError { .. }
38 | TokenRefreshError::ServiceUnavailable { .. } => {
39 crate::service_bus_manager::ServiceBusError::ConnectionFailed(err.to_string())
40 }
41 TokenRefreshError::RateLimited { .. } => {
42 crate::service_bus_manager::ServiceBusError::OperationTimeout(err.to_string())
43 }
44 _ => crate::service_bus_manager::ServiceBusError::AuthenticationError(err.to_string()),
45 }
46 }
47}