lunar-lib 0.11.0

Common utilities for lunar applications
Documentation
use crate::{
    database::{
        CompareAndSwapTransaction, CustomTransactionError, DatabaseEntry, Entry, TransactionError,
    },
    id::Id,
};

pub trait Createable: Sized + DatabaseEntry {
    type CreateArgs: Clone;
    type Err;

    /// Creates a new [`Self`] in the database using [`Self::CreateArgs`]
    ///
    /// This function should safely link references during its creation
    fn create(
        args: Self::CreateArgs,
        cas_tx: &mut CompareAndSwapTransaction<Self::DbInner>,
    ) -> Result<Entry<Self>, CustomTransactionError<Self::Err>>;
}

pub trait Mergeable: DatabaseEntry {
    /// Merge data from `from` into `self`
    fn merge_data(&mut self, from: Self);

    /// Relink entries pointing at `from` to point at `self`
    fn relink_references(
        from: &Entry<Self>,
        to: Id<Self>,
        cas_tx: &mut CompareAndSwapTransaction<Self::DbInner>,
    ) -> Result<(), TransactionError>;
}

pub trait Deleteable: Sized + DatabaseEntry {
    fn unlink_references(
        old: Entry<Self>,
        cas_tx: &mut CompareAndSwapTransaction<Self::DbInner>,
    ) -> Result<(), TransactionError>;
}