#[non_exhaustive]pub struct PushSubscriptionPatch<'a> {
pub verification_code: Option<&'a str>,
pub expires: Patch<&'a UTCDate>,
pub types: Patch<&'a [&'a str]>,
pub chat_push: Patch<&'a [(&'a Id, ChatPushConfig)]>,
}Expand description
Patch shape for PushSubscription/set update sub-operations (RFC 8620 §7.2.2).
Only the patchable properties are exposed. RFC 8620 §7.2 declares url
and keys immutable: to change those, destroy the subscription and create
a new one. device_client_id is also stable for the lifetime of the
subscription.
Fields left as their default (Patch::Keep / None for
verification_code) are omitted from the wire patch and the server leaves
the corresponding property unchanged.
The types and chat_push fields use the three-way Patch<T> shape
so the (set + clear) conflict is unrepresentable at the type level:
Patch::Setreplaces the property wholesale (an array of type names fortypes; achatPushobject built from the supplied(accountId, config)pairs forchat_push).Patch::Clearsends JSONnull, removing the property server-side. Fortypes,nullmeans “deliver all types” (RFC 8620 §7.2). Forchat_push,nullremoves all inline-push configuration (draft-atwood-jmap-chat-push-00 §3.1).Patch::Keep(default) omits the key from the patch.
The JMAP Chat Push extension does not define per-key patching of
chatPush, so Patch::Set replaces the full map.
§Debug redaction
verification_code is the RFC 8620 §7.2 push-subscription-ownership
proof — an attacker who learns the value can claim ownership of the
subscription. The Debug impl on this struct redacts it to
Some("[REDACTED]") / None so an accidental {:?}-format in an
application log, tracing span, or test fixture cannot leak it. Other
fields are not secrets and are rendered verbatim.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.verification_code: Option<&'a str>Replace the verification code (set after receiving a PushVerification
payload). None = no change.
RFC 8620 §7.2 ownership proof — redacted by the
std::fmt::Debug impl on this struct.
expires: Patch<&'a UTCDate>Set or clear the expiry timestamp. Patch::Clear sets expires to
null; the server SHOULD then choose a default expiry per RFC 8620 §7.2.
types: Patch<&'a [&'a str]>Replace or clear the types filter (RFC 8620 §7.2). Patch::Set
installs the array of type names; Patch::Clear sends JSON null
so the server delivers all types; Patch::Keep (default) leaves
the property unchanged.
chat_push: Patch<&'a [(&'a Id, ChatPushConfig)]>Replace or clear the chatPush extension property
(draft-atwood-jmap-chat-push-00 §3.1). Patch::Set installs the
chatPush map from the supplied (accountId, config) pairs;
Patch::Clear sends JSON null so the server removes all inline
push config; Patch::Keep (default) leaves the property
unchanged.
See the rustdoc on
PushSubscriptionCreateInput::chat_push for the rationale
behind the slice-of-pairs input shape (vs HashMap<Id, _>).