Skip to main content

selene_core/database/
entry_extensions.rs

1use lunar_lib::database::{
2    CustomTransactionError, DatabaseEntry, TransactionError, db_transaction,
3};
4
5use crate::database::{
6    Createable, LibraryDb, Mergeable, Patchable, tx_extensions::CasTxExtensions,
7};
8
9pub trait EntryExtensions: DatabaseEntry<EntryDb = LibraryDb> {
10    fn db_patch(self, db: Option<LibraryDb>) -> Result<(), TransactionError>
11    where
12        Self: Patchable<Self>;
13
14    fn db_create(args: Self::CreateArgs) -> Result<Self, CustomTransactionError<Self::Err>>
15    where
16        Self: Createable;
17
18    fn db_merge(&self, into: Self::Id) -> Result<(), CustomTransactionError<Self::Err>>
19    where
20        Self: Mergeable;
21}
22
23impl<T: DatabaseEntry<EntryDb = LibraryDb>> EntryExtensions for T {
24    fn db_patch(self, db: Option<LibraryDb>) -> Result<(), TransactionError>
25    where
26        Self: Patchable<Self>,
27    {
28        db_transaction(
29            |cas_tx| {
30                cas_tx
31                    .tx_patch(self.clone())
32                    .map_err(CustomTransactionError::from)
33            },
34            db,
35            false,
36        )
37        .map_err(TransactionError::from)
38    }
39
40    fn db_create(args: T::CreateArgs) -> Result<T, CustomTransactionError<T::Err>>
41    where
42        T: Createable,
43    {
44        db_transaction(|cas_tx| cas_tx.tx_create(args.clone()), None, false)
45    }
46
47    fn db_merge(&self, into: Self::Id) -> Result<(), CustomTransactionError<T::Err>>
48    where
49        T: Mergeable,
50    {
51        db_transaction(|cas_tx| cas_tx.tx_merge(self, into), None, false)
52    }
53}