use std::time::Duration;
use thiserror::Error;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, Error)]
pub enum AcmeError {
#[error("failed to fetch ACME directory: {0}")]
Directory(String),
#[error("nonce error: {0}")]
Nonce(String),
#[error("account error: {0}")]
Account(String),
#[error("order error: {0}")]
Order(String),
#[error("authorization error: {0}")]
Authorization(String),
#[error("challenge `{challenge_type}` failed: {message}")]
Challenge {
challenge_type: String,
message: String,
},
#[error("certificate download failed: {0}")]
Certificate(String),
#[error("rate limited by CA (retry after {retry_after:?}): {message}")]
RateLimited {
retry_after: Option<Duration>,
message: String,
},
}
#[derive(Debug, Error)]
pub enum StorageError {
#[error("key not found: {0}")]
NotFound(String),
#[error("failed to acquire lock: {0}")]
LockFailed(String),
#[error("storage I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("serialization error: {0}")]
Serialize(String),
#[error("deserialization error: {0}")]
Deserialize(String),
}
#[derive(Debug, Error)]
pub enum CryptoError {
#[error("key generation failed: {0}")]
KeyGeneration(String),
#[error("signing failed: {0}")]
Signing(String),
#[error("invalid key: {0}")]
InvalidKey(String),
#[error("invalid certificate: {0}")]
InvalidCertificate(String),
#[error("PEM encoding error: {0}")]
PemEncode(String),
#[error("PEM decoding error: {0}")]
PemDecode(String),
}
#[derive(Debug, Error)]
pub enum CertError {
#[error("certificate has expired: {0}")]
Expired(String),
#[error("certificate is not yet valid: {0}")]
NotYetValid(String),
#[error("certificate was revoked: {0}")]
Revoked(String),
#[error("OCSP check failed: {0}")]
OcspFailed(String),
#[error("invalid domain name: {0}")]
InvalidDomain(String),
}
#[derive(Debug, Error)]
pub enum Error {
#[error(transparent)]
Acme(#[from] AcmeError),
#[error(transparent)]
Storage(#[from] StorageError),
#[error(transparent)]
Crypto(#[from] CryptoError),
#[error(transparent)]
Cert(#[from] CertError),
#[error("configuration error: {0}")]
Config(String),
#[error("operation timed out: {0}")]
Timeout(String),
#[error("{0}")]
Other(String),
#[error("no retry: {0}")]
NoRetry(String),
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Storage(StorageError::Io(err))
}
}