pub struct KvSetRequest { /* private fields */ }Expand description
Fluent builder for Kv::set. Supply a value with one of .bytes (raw),
.json / .msgpack (built-in codecs), or .encode_with::<C> (any codec -
Avro, Protobuf, CBOR, Arrow, your own), optionally an expiry, then
.send().await. Values are stored as opaque bytes, and the codec is the
caller’s choice.
Implementations§
Source§impl KvSetRequest
impl KvSetRequest
Sourcepub fn bytes(self, payload: impl AsRef<[u8]>) -> Self
pub fn bytes(self, payload: impl AsRef<[u8]>) -> Self
Store raw bytes as the value (anything byte-like: Vec<u8>, &[u8],
&str, …). Use this for an already-encoded body (Avro / Protobuf /
Arrow / your own framing).
Sourcepub fn encode_with<C, T>(self, value: &T) -> Result<Self, LaserError>
pub fn encode_with<C, T>(self, value: &T) -> Result<Self, LaserError>
Encode value with any Codec and store the bytes. The generic path:
.json and .msgpack are one-line sugar over it.
Sourcepub fn json<T: Serialize + ?Sized>(self, value: &T) -> Result<Self, LaserError>
pub fn json<T: Serialize + ?Sized>(self, value: &T) -> Result<Self, LaserError>
JSON-encode value and store the bytes. Sugar for
.encode_with::<Json, _>.
Sourcepub fn msgpack<T: Serialize + ?Sized>(
self,
value: &T,
) -> Result<Self, LaserError>
pub fn msgpack<T: Serialize + ?Sized>( self, value: &T, ) -> Result<Self, LaserError>
MessagePack-encode value and store the bytes. Sugar for
.encode_with::<Msgpack, _>, more compact than JSON for binary state.
Sourcepub fn ttl(self, ttl: Duration) -> Self
pub fn ttl(self, ttl: Duration) -> Self
Expire the entry ttl from now. Overrides any prior expires_at.
Sourcepub fn expires_at(self, epoch_micros: u64) -> Self
pub fn expires_at(self, epoch_micros: u64) -> Self
Expire the entry at an absolute epoch-microseconds timestamp.
Sourcepub fn expect_version(self, version: u64) -> Self
pub fn expect_version(self, version: u64) -> Self
Make this a compare-and-swap that applies only if the key currently holds
version (the KvEntry::version from a prior read). Finish with
commit. Lock-free optimistic concurrency: read the
version, compute the new value, commit, and retry on a conflict.
let entry = kv.get_entry("counter").await?.expect("seeded");
let prev: u64 = String::from_utf8_lossy(&entry.value).parse().unwrap_or(0);
let next = kv.set("counter").json(&(prev + 1))?.expect_version(entry.version).commit().await?;Sourcepub fn expect_absent(self) -> Self
pub fn expect_absent(self) -> Self
Make this a compare-and-swap that applies only if the key does not yet
exist (a create-if-absent). Finish with commit. A racing
writer that got there first surfaces as a conflict.
Sourcepub async fn commit(self) -> Result<u64, LaserError>
pub async fn commit(self) -> Result<u64, LaserError>
Apply a compare-and-swap write set up by expect_version
or expect_absent, returning the entry’s new
version. The precondition miss is a typed
KvError::VersionConflict
carrying the current version, so the caller can re-read and retry.
Returns LaserError::Invalid if no precondition was set (use send for
an unconditional write), and LaserError::Unsupported when the
deployment does not advertise the kv_cas capability.
Sourcepub async fn send(self) -> Result<(), LaserError>
pub async fn send(self) -> Result<(), LaserError>
Apply the unconditional write. Returns LaserError::Invalid when a
precondition was set with expect_version or
expect_absent: finish those with
commit, so a precondition is never dropped.
Auto Trait Implementations§
impl !RefUnwindSafe for KvSetRequest
impl !UnwindSafe for KvSetRequest
impl Freeze for KvSetRequest
impl Send for KvSetRequest
impl Sync for KvSetRequest
impl Unpin for KvSetRequest
impl UnsafeUnpin for KvSetRequest
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.