crdb_client/
obj.rs

1use crate::ClientDb;
2use crdb_core::{ClientSideDb, DbPtr, Object};
3use educe::Educe;
4use std::{fmt::Debug, future::Future, ops::Deref, sync::Arc};
5
6#[derive(Educe)]
7#[educe(Clone, Debug(bound(T: Debug)))]
8pub struct Obj<T: Object, LocalDb: ClientSideDb> {
9    ptr: DbPtr<T>,
10    data: Arc<T>,
11
12    #[educe(Debug(ignore))]
13    db: Arc<ClientDb<LocalDb>>,
14}
15
16impl<T: Object, LocalDb: ClientSideDb> Obj<T, LocalDb> {
17    pub(crate) fn new(ptr: DbPtr<T>, data: Arc<T>, db: Arc<ClientDb<LocalDb>>) -> Obj<T, LocalDb> {
18        Obj { ptr, data, db }
19    }
20
21    pub fn ptr(&self) -> DbPtr<T> {
22        self.ptr
23    }
24
25    pub async fn submit(
26        &self,
27        event: T::Event,
28    ) -> crate::Result<impl Future<Output = crate::Result<()>>> {
29        self.db.submit::<T>(self.ptr, event).await
30    }
31}
32
33impl<T: Object, LocalDb: ClientSideDb> Deref for Obj<T, LocalDb> {
34    type Target = T;
35
36    fn deref(&self) -> &T {
37        &self.data
38    }
39}