Skip to main content

KvReader

Trait KvReader 

Source
pub trait KvReader: Send + Sync {
    // Required methods
    fn get<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str,
    ) -> Pin<Box<dyn Future<Output = Result<Option<KvEntry>, KvError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait,
             'life1: 'async_trait;
    fn keys<'life0, 'life1, 'async_trait>(
        &'life0 self,
        prefix: &'life1 str,
    ) -> Pin<Box<dyn Future<Output = Result<Vec<String>, KvError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait,
             'life1: 'async_trait;
    fn scan<'life0, 'life1, 'async_trait>(
        &'life0 self,
        prefix: &'life1 str,
    ) -> Pin<Box<dyn Future<Output = Result<Vec<KvEntry>, KvError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait,
             'life1: 'async_trait;
    fn entry<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str,
    ) -> Pin<Box<dyn Future<Output = Result<Option<KvEntry>, KvError>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait,
             'life1: 'async_trait;
}
Expand description

Core read-only KV operations - the minimal interface every store must implement.

Required Methods§

Source

fn get<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<KvEntry>, KvError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get a value by key. Returns None if the key doesn’t exist.

Backends that use empty-value tombstones (NATS: delete_with_version writes an empty-value Put so concurrent CAS writers still conflict) also return None for a stored empty value — get() cannot tell a real b"" apart from a tombstone. A caller using zero-length values as a presence signal (locks, feature flags) must use entry, which exposes the raw record including empty-value Puts.

Source

fn keys<'life0, 'life1, 'async_trait>( &'life0 self, prefix: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<String>, KvError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get all keys matching a prefix. Returns keys only, not values.

Source

fn scan<'life0, 'life1, 'async_trait>( &'life0 self, prefix: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<KvEntry>, KvError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get multiple entries by prefix. Useful for bulk loading.

Source

fn entry<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Option<KvEntry>, KvError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get the raw entry for a key, including tombstones (empty-value Put entries written by delete_with_version). Most callers should use get() instead, which filters tombstones for consistency with scan().

REQUIRED (no default) — deliberately. A default delegating to get() silently hid tombstones on any backend that forgot to override it, which breaks CAS callers that need the tombstone’s version: e.g. ExportLease::try_acquire reads an abandoned (CAS-deleted) lease’s version through entry() for its takeover write — with a get() default it would see None and report the round as live instead of stealing it. Backends without empty-value tombstone semantics (where delete genuinely removes the key) should implement this as a delegation to get() — explicitly, so the choice is a reviewed decision rather than an inherited footgun.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§