selene-core 0.5.2

selene-core is the backend for Selene, a local-first music player
Documentation
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)
    }
}