use thiserror::Error;
#[derive(Debug, Error)]
pub enum CredentialError {
#[error("no credentials registered for provider '{0}'")]
NotConfigured(String),
#[error("invalid credential material for provider '{provider_id}': {reason}")]
InvalidMaterial { provider_id: String, reason: String },
#[error("signing failed for provider '{provider_id}': {reason}")]
SigningFailed { provider_id: String, reason: String },
#[error("token endpoint rejected request for provider '{provider_id}': {status} — {body}")]
PermanentUpstream {
provider_id: String,
status: u16,
body: String,
},
#[error("token endpoint transient failure for provider '{provider_id}': {reason}")]
TransientUpstream { provider_id: String, reason: String },
#[error("network error reaching token endpoint for provider '{provider_id}': {reason}")]
Network { provider_id: String, reason: String },
}
impl CredentialError {
pub fn is_retryable(&self) -> bool {
matches!(self, Self::TransientUpstream { .. } | Self::Network { .. })
}
}