use thiserror::Error;
#[derive(Debug, Error)]
pub enum KwtError {
#[error("malformed token: {0}")]
MalformedToken(String),
#[error("unknown version prefix: {0}")]
UnknownVersion(String),
#[error("base64 decode failed: {0}")]
Base64Error(String),
#[error("authentication failed")]
AuthenticationFailed,
#[error("key derivation failed")]
KeyDerivationFailed,
#[error("payload parse error: {0}")]
PayloadError(String),
#[error("token expired")]
Expired,
#[error("token not yet valid")]
NotYetValid,
#[error("audience mismatch: expected {expected}, got {got}")]
AudienceMismatch { expected: String, got: String },
#[error("missing required claim: {0}")]
MissingClaim(String),
#[error("invalid claim value: {0}")]
InvalidClaim(String),
#[error("token replayed (jti already seen)")]
Replayed,
#[error("system clock unavailable")]
SystemTime,
#[error("random number generator unavailable")]
EntropyUnavailable,
}
impl KwtError {
pub fn public_message(&self) -> &'static str {
match self {
KwtError::MalformedToken(_)
| KwtError::UnknownVersion(_)
| KwtError::Base64Error(_)
| KwtError::AuthenticationFailed
| KwtError::KeyDerivationFailed
| KwtError::PayloadError(_)
| KwtError::AudienceMismatch { .. }
| KwtError::MissingClaim(_)
| KwtError::InvalidClaim(_)
| KwtError::Replayed => "invalid token",
KwtError::Expired => "token expired",
KwtError::NotYetValid => "token not yet valid",
KwtError::SystemTime | KwtError::EntropyUnavailable => "service unavailable",
}
}
}