pub enum ErrorClass {
Retryable,
Permanent,
Ambiguous,
}Expand description
Classification of errors encountered during publishing.
Error classification determines whether a publish attempt should be retried. Some errors are permanent (retrying won’t help) while others are transient (likely to succeed on retry).
§Example
ⓘ
use shipper::types::ErrorClass;
// Network issues, rate limiting - worth retrying
let retryable = ErrorClass::Retryable;
// Invalid credentials, version conflict - won't succeed on retry
let permanent = ErrorClass::Permanent;
// Unclear - may or may not be retryable
let ambiguous = ErrorClass::Ambiguous;§Classification is a hint, not truth
This enum is produced by parsing cargo’s stdout/stderr — a human-facing log that is explicitly not a stable machine protocol. Pattern-matching on cargo text gives Shipper a fast first-pass signal, but it must never be treated as the final word on what actually happened:
ErrorClass::PermanentandErrorClass::Retryableare still hints — they drive retry scheduling, but every retry attempt re-checks the registry before and after the nextcargo publish.ErrorClass::Ambiguousis the dangerous case. Cargo’s publish flow uploads to the registry first and polls the index afterwards; the poll can time out without affecting the upload. So a non-zero cargo exit can coexist with a successful upload. Ambiguous outcomes MUST be reconciled against registry truth before any further action — never blind-retry. SeeReconciliationOutcomeand the reconciliation flow inshipper::engine::parallel::reconcile.
The authoritative classification for Ambiguous outcomes comes from
querying the registry (sparse index + API) after the fact. Cargo
stderr is a signal; the registry is the source of truth.
§Classification Heuristics (hints)
Shipper uses various heuristics to classify errors:
- HTTP 429 (Too Many Requests) → Retryable
- HTTP 401/403 (Auth errors) → Permanent
- HTTP 409 (Version conflict) → Permanent
- Network timeouts → Retryable
- Unknown errors → Ambiguous (triggers registry reconciliation)
Variants§
Trait Implementations§
Source§impl Clone for ErrorClass
impl Clone for ErrorClass
Source§fn clone(&self) -> ErrorClass
fn clone(&self) -> ErrorClass
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for ErrorClass
impl Debug for ErrorClass
Source§impl<'de> Deserialize<'de> for ErrorClass
impl<'de> Deserialize<'de> for ErrorClass
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl PartialEq for ErrorClass
impl PartialEq for ErrorClass
Source§impl Serialize for ErrorClass
impl Serialize for ErrorClass
impl Eq for ErrorClass
impl StructuralPartialEq for ErrorClass
Auto Trait Implementations§
impl Freeze for ErrorClass
impl RefUnwindSafe for ErrorClass
impl Send for ErrorClass
impl Sync for ErrorClass
impl Unpin for ErrorClass
impl UnsafeUnpin for ErrorClass
impl UnwindSafe for ErrorClass
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key and return true if they are equal.