selene_core/database/
entry_extensions.rs1use 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}