#[derive(Debug, thiserror::Error)]
pub enum AuthError {
#[error("invalid api key: {0}")]
InvalidApiKey(String),
#[error("api key expired: {0}")]
ExpiredApiKey(String),
#[error("invalid jwt: {0}")]
InvalidJwt(String),
#[error("jwt expired")]
ExpiredJwt,
#[error("invalid client certificate: {0}")]
InvalidCertificate(String),
#[error("no authentication provided")]
NoAuth,
#[error("encryption error: {0}")]
Encryption(String),
#[error("decryption error: {0}")]
Decryption(String),
#[error("key not found: {0}")]
KeyNotFound(String),
#[error("auth config error: {0}")]
Config(String),
}
impl AuthError {
#[must_use]
pub fn client_message(&self) -> &'static str {
match self {
Self::InvalidApiKey(_) | Self::InvalidJwt(_) | Self::InvalidCertificate(_) => {
"invalid credentials"
}
Self::ExpiredApiKey(_) | Self::ExpiredJwt => "credentials expired",
Self::NoAuth => "authentication required",
Self::Encryption(_) | Self::Decryption(_) | Self::KeyNotFound(_) => "internal error",
Self::Config(_) => "service misconfigured",
}
}
#[must_use]
pub fn is_auth_failure(&self) -> bool {
matches!(
self,
Self::InvalidApiKey(_)
| Self::InvalidJwt(_)
| Self::InvalidCertificate(_)
| Self::ExpiredApiKey(_)
| Self::ExpiredJwt
| Self::NoAuth
)
}
}