use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OAuth2Error {
InvalidTokenEndpoint {
url: String,
reason: String,
},
TokenAcquisitionFailed {
reason: String,
},
TokenExpired,
TokenRefreshFailed {
reason: String,
},
InvalidTokenResponse {
reason: String,
},
NetworkError {
reason: String,
},
ConfigurationError {
reason: String,
},
}
impl std::error::Error for OAuth2Error {}
impl fmt::Display for OAuth2Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidTokenEndpoint { url, reason } => {
write!(f, "Invalid token endpoint URL '{url}': {reason}")
}
Self::TokenAcquisitionFailed { reason } => {
write!(f, "Token acquisition failed: {reason}")
}
Self::TokenExpired => {
write!(
f,
"OAuth2 token has expired and no refresh token is available"
)
}
Self::TokenRefreshFailed { reason } => {
write!(f, "Token refresh failed: {reason}")
}
Self::InvalidTokenResponse { reason } => {
write!(f, "Invalid OAuth2 token response: {reason}")
}
Self::NetworkError { reason } => {
write!(f, "Network error during OAuth2 request: {reason}")
}
Self::ConfigurationError { reason } => {
write!(f, "OAuth2 configuration error: {reason}")
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_display_invalid_token_endpoint() {
let error = OAuth2Error::InvalidTokenEndpoint {
url: "not-a-url".to_string(),
reason: "missing scheme".to_string(),
};
assert_eq!(
error.to_string(),
"Invalid token endpoint URL 'not-a-url': missing scheme"
);
}
#[test]
fn should_display_token_acquisition_failed() {
let error = OAuth2Error::TokenAcquisitionFailed {
reason: "invalid_client".to_string(),
};
assert_eq!(
error.to_string(),
"Token acquisition failed: invalid_client"
);
}
#[test]
fn should_display_token_expired() {
let error = OAuth2Error::TokenExpired;
assert_eq!(
error.to_string(),
"OAuth2 token has expired and no refresh token is available"
);
}
#[test]
fn should_display_configuration_error() {
let error = OAuth2Error::ConfigurationError {
reason: "missing client_secret".to_string(),
};
assert_eq!(
error.to_string(),
"OAuth2 configuration error: missing client_secret"
);
}
}