#![allow(clippy::type_complexity)]
use core::fmt;
use std::ops::RangeBounds;
use serde::de::DeserializeOwned;
use serde::Serialize;
pub trait DataStore {
type DbError: fmt::Debug;
fn get<K, V>(&self, key: &K) -> Result<Option<V>, crate::Error<Self::DbError>>
where
K: Serialize,
V: DeserializeOwned;
fn remove<K, V>(&self, key: &K) -> Result<Option<V>, crate::Error<Self::DbError>>
where
K: Serialize,
V: DeserializeOwned;
fn insert<'a, K, V, OwnedV>(
&self,
key: &'a K,
val: &'a V,
) -> Result<Option<OwnedV>, crate::Error<Self::DbError>>
where
K: Serialize,
V: Serialize + ?Sized,
OwnedV: std::borrow::Borrow<V> + DeserializeOwned;
}
pub trait Atomic: DataStore {
fn atomic_update<K, V>(
&self,
key: &K,
op: impl FnMut(V) -> V + Clone,
) -> Result<(), crate::Error<Self::DbError>>
where
K: Serialize,
V: Serialize + DeserializeOwned;
fn conditional_update<K, V>(
&self,
key: &K,
new: &V,
expected: &V,
) -> Result<(), crate::Error<Self::DbError>>
where
K: Serialize + ?Sized,
V: Serialize + ?Sized;
}
pub trait Ordered: DataStore {
fn get_lt<InKey, OutKey, Value>(
&self,
key: &InKey,
) -> Result<Option<(OutKey, Value)>, crate::Error<Self::DbError>>
where
InKey: Serialize,
OutKey: Serialize + DeserializeOwned,
Value: Serialize + DeserializeOwned;
fn get_gt<InKey, OutKey, Value>(
&self,
key: &InKey,
) -> Result<Option<(OutKey, Value)>, crate::Error<Self::DbError>>
where
InKey: Serialize,
OutKey: Serialize + DeserializeOwned,
Value: Serialize + DeserializeOwned;
}
pub trait Ranged: DataStore {
fn range<InKey, OutKey, Value>(
&self,
range: impl RangeBounds<InKey>,
) -> Result<
impl Iterator<Item = Result<(OutKey, Value), crate::Error<Self::DbError>>>,
crate::Error<Self::DbError>,
>
where
InKey: Serialize,
OutKey: Serialize + DeserializeOwned,
Value: Serialize + DeserializeOwned;
}