use serde::{Deserialize, Serialize, de::DeserializeOwned};
use sled::Tree;
use crate::database::{
CompareAndSwapTransaction, Database, EntryId, TransactionError, deserialize_from_ivec,
sled_get_all_raw, sled_get_batch_raw, sled_get_raw,
};
pub trait DatabaseEntry:
Serialize + DeserializeOwned + for<'de> Deserialize<'de> + Clone + std::fmt::Debug + 'static
{
type Db: Database;
type Id: EntryId<Entry = Self, IdDb = Self::Db>;
const VERSION_NUMBER: u32;
const TREE_NAME: &str;
fn db_check(id: Self::Id, db: &Self::Db) -> Result<bool, TransactionError> {
Ok(Self::__tree(db).contains_key(*id)?)
}
fn db_get(id: Self::Id, db: &Self::Db) -> Result<Option<Self>, TransactionError> {
sled_get_raw(&Self::__tree(db), id.as_bytes())?
.map(deserialize_from_ivec)
.transpose()
}
fn db_get_all(db: &Self::Db) -> Result<Vec<Self>, TransactionError> {
sled_get_all_raw(&Self::__tree(db))?
.into_iter()
.map(deserialize_from_ivec)
.collect()
}
fn db_get_batch<I>(ids: I, db: &Self::Db) -> Result<Vec<Self>, TransactionError>
where
I: IntoIterator<Item = Self::Id>,
{
let items = sled_get_batch_raw(&Self::__tree(db), ids.into_iter().map(|a| *a.as_bytes()))?;
items.into_iter().map(deserialize_from_ivec).collect()
}
fn pre_upsert(
&mut self,
_cas_tx: &CompareAndSwapTransaction<Self::Db>,
) -> Result<(), TransactionError> {
Ok(())
}
fn read_only(&self) -> bool {
false
}
fn id(&self) -> Self::Id;
fn __tree(db: &Self::Db) -> Tree {
db.db().open_tree(Self::TREE_NAME).unwrap()
}
}