crdb-client 0.0.1-alpha.0

Concurrently Replicated DataBase
Documentation
use crate::ClientDb;
use crdb_core::{ClientSideDb, DbPtr, Object};
use educe::Educe;
use std::{fmt::Debug, future::Future, ops::Deref, sync::Arc};

#[derive(Educe)]
#[educe(Clone, Debug(bound(T: Debug)))]
pub struct Obj<T: Object, LocalDb: ClientSideDb> {
    ptr: DbPtr<T>,
    data: Arc<T>,

    #[educe(Debug(ignore))]
    db: Arc<ClientDb<LocalDb>>,
}

impl<T: Object, LocalDb: ClientSideDb> Obj<T, LocalDb> {
    pub(crate) fn new(ptr: DbPtr<T>, data: Arc<T>, db: Arc<ClientDb<LocalDb>>) -> Obj<T, LocalDb> {
        Obj { ptr, data, db }
    }

    pub fn ptr(&self) -> DbPtr<T> {
        self.ptr
    }

    pub async fn submit(
        &self,
        event: T::Event,
    ) -> crate::Result<impl Future<Output = crate::Result<()>>> {
        self.db.submit::<T>(self.ptr, event).await
    }
}

impl<T: Object, LocalDb: ClientSideDb> Deref for Obj<T, LocalDb> {
    type Target = T;

    fn deref(&self) -> &T {
        &self.data
    }
}