wedb_embed 0.1.2

Embedded database engine providing Redis-like APIs, built on fjall / 嵌入式数据库引擎,提供类似 Redis 的接口,底层基于 fjall 开发
Documentation
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};

/// 数据库操作目标基础抽象
///
/// 提供底层数据 Keyspace (`data`)、元数据 Keyspace (`meta`)、键编排器 (`kc`) 与底层存储引擎 (`db`)。
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()
  }
}

/// 聚合全部数据结构操作的顶层超级 Trait (Api)
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,
  };
}