use std::{
collections::HashSet,
ops::Deref,
sync::{Arc, Weak},
};
pub use self::sync_subscription::SyncSubscription;
mod sync_subscription;
use crate::{
ditto::{Ditto, DittoFields},
dql::*,
error::DittoError,
utils::SetArc,
};
pub struct Sync {
ditto: Weak<DittoFields>,
}
impl Sync {
pub(crate) fn new(ditto: Weak<DittoFields>) -> Self {
Self { ditto }
}
#[doc(hidden)]
#[deprecated(note = "Use `ditto.sync().subscriptions_v2()` instead.")]
pub fn subscriptions(&self) -> impl '_ + Deref<Target = SetArc<SyncSubscription>> {
let ditto = Ditto::upgrade(&self.ditto).expect("Ditto went out of scope");
let sync_subscriptions = ffi_sdk::dittoffi_sync_subscriptions(&ditto.ditto);
let sync_subscriptions: Vec<_> = sync_subscriptions.into();
let sync_subscriptions = sync_subscriptions
.into_iter()
.map(|handle| Arc::new(SyncSubscription { handle }))
.collect::<SetArc<_>>();
Box::new(sync_subscriptions)
}
pub fn subscriptions_v2(&self) -> HashSet<SyncSubscription> {
let ditto = Ditto::upgrade(&self.ditto).expect("Ditto went out of scope");
let sync_subscriptions = ffi_sdk::dittoffi_sync_subscriptions(&ditto.ditto);
let sync_subscriptions: Vec<_> = sync_subscriptions.into();
sync_subscriptions
.into_iter()
.map(|handle| SyncSubscription { handle })
.collect::<HashSet<_>>()
}
pub fn register_subscription<Q>(
&self,
query: Q,
query_args: Option<QueryArguments>,
) -> Result<Arc<SyncSubscription>, DittoError>
where
Q: TryInto<Query, Error = DittoError>,
{
let ditto = Ditto::upgrade(&self.ditto)?;
let subscription = SyncSubscription::new(&ditto, query.try_into()?, query_args)?;
let subscription = Arc::new(subscription);
Ok(subscription)
}
}