#[non_exhaustive]pub enum Error {
InvalidConfiguration(String),
Validation(Box<Failure>),
Auth(Box<Failure>),
Quota(Box<Failure>),
Conflict(Box<Failure>),
Network(Box<Failure>),
Timeout(Box<Failure>),
Server(Box<Failure>),
Http(Box<Failure>),
}Expand description
Everything that can go wrong. Every variant except
InvalidConfiguration carries a Failure with the details
(status, API error code, field errors, the idempotency key that was used, attempts, …).
use honk_me::Error;
match honk.send(&msg, "order-1042-failed").await {
Ok(accepted) => println!("stored as {}", accepted.id),
Err(Error::Validation(f)) => eprintln!("a bug, don't retry: {:?}", f.fields),
Err(e) if e.is_retryable() => {
// Queue it and retry later with the same key: Honk deduplicates.
let (key, after) = (e.idempotency_key(), e.retry_after());
}
Err(e) => eprintln!("{e}"),
}Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
InvalidConfiguration(String)
The client is misconfigured: a missing or malformed URL or key (from
Honk::new, the builder or from_env).
Validation(Box<Failure>)
The message is invalid: rejected locally (failure.local) or by the server (400, 413,
415, 422). Failure::fields lists every problem. Fix the message; don’t retry.
Auth(Box<Failure>)
401 or 403: invalid_key, priority_not_allowed (urgent without allow_urgent),
project_suspended or workspace_suspended.
Quota(Box<Failure>)
429 after retries: quota_exceeded (daily, resets at UTC midnight), rate_limited or
overloaded. See Failure::retry_after.
Conflict(Box<Failure>)
409 idempotency_conflict: the key was already used with a different payload in the
last 24 hours. Use a new key, or send the original payload.
Network(Box<Failure>)
Honk could not be reached on any attempt before the deadline.
Timeout(Box<Failure>)
The attempts timed out. The event may or may not have been stored; retrying later with the same idempotency key is safe.
Server(Box<Failure>)
5xx on every attempt before the deadline.
Http(Box<Failure>)
Any other unexpected answer: 404 (wrong URL), a redirect (never followed), a 2xx without a message id.
Implementations§
Source§impl Error
impl Error
Sourcepub fn failure(&self) -> Option<&Failure>
pub fn failure(&self) -> Option<&Failure>
The details of the failure (None for Error::InvalidConfiguration).
Sourcepub fn is_retryable(&self) -> bool
pub fn is_retryable(&self) -> bool
Whether sending the same event again later (with the same idempotency key) may succeed: network errors, timeouts, 429 and 5xx.
Sourcepub fn code(&self) -> Option<&str>
pub fn code(&self) -> Option<&str>
The API error code (invalid_key, quota_exceeded, …), when there is one.
Sourcepub fn fields(&self) -> &[FieldError]
pub fn fields(&self) -> &[FieldError]
Every invalid field (empty unless Error::Validation).
Sourcepub fn idempotency_key(&self) -> Option<&str>
pub fn idempotency_key(&self) -> Option<&str>
The idempotency key that was used, to retry the same event later.
Sourcepub fn retry_after(&self) -> Option<Duration>
pub fn retry_after(&self) -> Option<Duration>
The server’s Retry-After, when present.
Trait Implementations§
Source§impl Error for Error
impl Error for Error
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()