pub type Result<T, E = Error> = std::result::Result<T, E>;
#[non_exhaustive]
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error(
"invalid encryption key length for {algorithm}: expected {expected} bytes, got {actual}"
)]
InvalidKeyLength {
algorithm: &'static str,
expected: usize,
actual: usize,
},
#[error("invalid IV length for {mode}: expected {expected} bytes, got {actual}")]
InvalidIvLength {
mode: &'static str,
expected: usize,
actual: usize,
},
#[error("invalid APNs collapse id: expected at most 64 bytes, got {actual}")]
InvalidCollapseId {
actual: usize,
},
#[error("delete messages require an id")]
MissingMessageIdForDelete,
#[error("message body or markdown is required")]
EmptyMessage,
#[error("invalid APNs header value for {name}: {source}")]
InvalidHeaderValue {
name: &'static str,
#[source]
source: reqwest::header::InvalidHeaderValue,
},
#[error("failed to build HTTP client: {0}")]
HttpClient(#[source] reqwest::Error),
#[error("APNs request failed: {0}")]
Http(#[from] reqwest::Error),
#[error("APNs token generation failed: {0}")]
Jwt(#[from] jsonwebtoken::errors::Error),
#[error("failed to serialize payload: {0}")]
Json(#[from] serde_json::Error),
#[error("encryption failed")]
Encryption,
#[error("failed to generate random IV: {0}")]
Random(
String,
),
#[error("APNs failed for one or more devices: {0}")]
ApnsFailures(
String,
),
}
impl From<getrandom::Error> for Error {
fn from(error: getrandom::Error) -> Self {
Self::Random(error.to_string())
}
}