#[non_exhaustive]pub enum BackendChangesError<E> {
CannotCalculate,
TooManyChanges {
limit: u64,
},
Other(E),
}Expand description
Error type returned by JmapBackend::get_changes and
JmapBackend::query_changes.
§CannotCalculate vs TooManyChanges
The two non-Other variants map to two distinct JMAP wire errors
(RFC 8620 §5.6). Previously a single TooManyChanges { limit: 0 }
variant overloaded both meanings via a magic-zero sentinel; the
CannotCalculate variant was added in bd:JMAP-jfia.31 to surface
the distinction at the type level. TooManyChanges { limit: 0 }
is preserved as a permanent legacy alias — it still maps to
cannotCalculateChanges via the From and Display impls — but
new backends SHOULD construct CannotCalculate directly. See the
TooManyChanges variant docs for why the alias cannot be
#[deprecated] at the type level (bd:JMAP-jfia.37).
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
CannotCalculate
The server has no usable change log for the given sinceState
and cannot supply incremental changes — the client MUST
discard ALL locally cached objects for the affected type,
reset its local state token to the empty string, and perform a
full resync (/get with ids: null). Partial recovery is not
permitted. Maps to cannotCalculateChanges (RFC 8620 §5.6;
authoritative behavior documented in jmapio/jmap-js
mail-model.js).
Added in bd:JMAP-jfia.31 to replace the
TooManyChanges { limit: 0 } magic-zero overload. New backends
SHOULD construct CannotCalculate directly; legacy backends
that emit TooManyChanges { limit: 0 } still map to the same
wire error via the permanent legacy alias (bd:JMAP-jfia.37).
TooManyChanges
The change window exceeds what the server can supply in a
single /changes response. Maps to tooManyChanges with the
limit as the suggested maximum — the client may retry with
a smaller window.
Legacy sub-case (bd:JMAP-jfia.31, bd:JMAP-jfia.37): a
limit of 0 historically meant “full state reset
required” and is preserved as an alias for the new
Self::CannotCalculate variant. New code SHOULD use
CannotCalculate directly. The alias is permanent at
the type level — Rust cannot #[deprecated] a single
discriminator value of an enum variant without deprecating
the variant itself, and removing the alias would silently
break any backend still emitting TooManyChanges { limit: 0 }
(their returns would stop mapping to cannotCalculateChanges
and start emitting a malformed RFC 8620 §5.6 tooManyChanges
with limit: 0). The From and Display impls below pin
the alias semantics permanently. Match arms in extension
servers SHOULD treat TooManyChanges { limit: 0 } and
CannotCalculate as a single “full-resync required” case
rather than branching them apart.
Fields
limit: u64Maximum window size the server can supply in a single
/changes response. A value of 0 is the permanent
legacy alias for Self::CannotCalculate; any non-zero
value is the suggested maximum the client may retry with.
Other(E)
An unexpected storage-layer error.
Trait Implementations§
Source§impl<E: Debug> Debug for BackendChangesError<E>
impl<E: Debug> Debug for BackendChangesError<E>
Source§impl<E: Display> Display for BackendChangesError<E>
impl<E: Display> Display for BackendChangesError<E>
Source§impl<E: Error + 'static> Error for BackendChangesError<E>
impl<E: Error + 'static> Error for BackendChangesError<E>
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()