use std::sync::Arc;
pub use crate::api::{
bitmap::Bitmap, bloom::Bloom, geo::Geo, hash::Hash, hll::Hll, json::Json, key::Key, list::List,
set::Set, sortedint::SortedInt, stream::Stream, string::Kv, tdigest::TDigest,
timeseries::TimeSeries, zset::ZSet,
};
use crate::{db::WeDb, key_composer::KeyComposer, namespace::Namespace};
pub trait DbLike {
fn data(&self) -> &fjall::Keyspace;
fn meta(&self) -> &fjall::Keyspace;
fn kc(&self) -> KeyComposer<'_>;
fn db(&self) -> &fjall::Database;
#[inline]
fn batch(&self) -> fjall::OwnedWriteBatch {
self.db().batch()
}
}
impl DbLike for WeDb {
#[inline]
fn data(&self) -> &fjall::Keyspace {
&self.data
}
#[inline]
fn meta(&self) -> &fjall::Keyspace {
&self.meta
}
#[inline]
fn kc(&self) -> KeyComposer<'_> {
KeyComposer::new("default")
}
#[inline]
fn db(&self) -> &fjall::Database {
&self.db
}
}
impl<'a> DbLike for Namespace<'a> {
#[inline]
fn data(&self) -> &fjall::Keyspace {
self.db.data_ks(&self.kc)
}
#[inline]
fn meta(&self) -> &fjall::Keyspace {
self.db.meta_ks(&self.kc)
}
#[inline]
fn kc(&self) -> KeyComposer<'_> {
self.kc
}
#[inline]
fn db(&self) -> &fjall::Database {
&self.db.db
}
}
impl<T: DbLike + ?Sized> DbLike for &T {
#[inline]
fn data(&self) -> &fjall::Keyspace {
(**self).data()
}
#[inline]
fn meta(&self) -> &fjall::Keyspace {
(**self).meta()
}
#[inline]
fn kc(&self) -> KeyComposer<'_> {
(**self).kc()
}
#[inline]
fn db(&self) -> &fjall::Database {
(**self).db()
}
}
impl<T: DbLike + ?Sized> DbLike for Arc<T> {
#[inline]
fn data(&self) -> &fjall::Keyspace {
(**self).data()
}
#[inline]
fn meta(&self) -> &fjall::Keyspace {
(**self).meta()
}
#[inline]
fn kc(&self) -> KeyComposer<'_> {
(**self).kc()
}
#[inline]
fn db(&self) -> &fjall::Database {
(**self).db()
}
}
pub trait Api:
DbLike
+ Kv
+ Hash
+ List
+ Set
+ ZSet
+ Bitmap
+ Bloom
+ Stream
+ TimeSeries
+ Json
+ TDigest
+ Geo
+ Hll
+ SortedInt
+ Key
{
}
impl<
T: DbLike
+ Kv
+ Hash
+ List
+ Set
+ ZSet
+ Bitmap
+ Bloom
+ Stream
+ TimeSeries
+ Json
+ TDigest
+ Geo
+ Hll
+ SortedInt
+ Key,
> Api for T
{
}
pub use Api as Redis;
pub mod prelude {
pub use crate::traits::{
Api, Bitmap, Bloom, DbLike, Geo, Hash, Hll, Json, Key, Kv, List, Redis, Set, SortedInt, Stream,
TDigest, TimeSeries, ZSet,
};
}