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}