use lunar_lib::database::{
CustomTransactionError, DatabaseEntry, TransactionError, db_transaction,
};
use crate::database::{
Createable, LibraryDb, Mergeable, Patchable, tx_extensions::CasTxExtensions,
};
pub trait EntryExtensions: DatabaseEntry<EntryDb = LibraryDb> {
fn db_patch(self, db: Option<LibraryDb>) -> Result<(), TransactionError>
where
Self: Patchable<Self>;
fn db_create(args: Self::CreateArgs) -> Result<Self, CustomTransactionError<Self::Err>>
where
Self: Createable;
fn db_merge(&self, into: Self::Id) -> Result<(), CustomTransactionError<Self::Err>>
where
Self: Mergeable;
}
impl<T: DatabaseEntry<EntryDb = LibraryDb>> EntryExtensions for T {
fn db_patch(self, db: Option<LibraryDb>) -> Result<(), TransactionError>
where
Self: Patchable<Self>,
{
db_transaction(
|cas_tx| {
cas_tx
.tx_patch(self.clone())
.map_err(CustomTransactionError::from)
},
db,
false,
)
.map_err(TransactionError::from)
}
fn db_create(args: T::CreateArgs) -> Result<T, CustomTransactionError<T::Err>>
where
T: Createable,
{
db_transaction(|cas_tx| cas_tx.tx_create(args.clone()), None, false)
}
fn db_merge(&self, into: Self::Id) -> Result<(), CustomTransactionError<T::Err>>
where
T: Mergeable,
{
db_transaction(|cas_tx| cas_tx.tx_merge(self, into), None, false)
}
}