use std::ops::Deref;
use std::sync::Arc;
use crate::client::blocking::{ClientRequestBuilders, Subscription};
use crate::client::sync::Client;
use crate::transport::MessageBus;
use crate::Error;
use super::common::stream_decoders::DisplayGroupUpdate;
use super::encoders;
#[must_use = "DisplayGroupSubscription must be polled (deref to Subscription, then .next() or .iter()) to receive updates; dropping it releases the subscription"]
pub struct DisplayGroupSubscription {
inner: Subscription<DisplayGroupUpdate>,
message_bus: Arc<dyn MessageBus>,
}
impl DisplayGroupSubscription {
pub fn update(&self, contract_info: &str) -> Result<(), Error> {
let request_id = self.inner.request_id().expect("subscription has no request ID");
let request = encoders::encode_update_display_group(request_id, contract_info)?;
self.message_bus.send_message(&request)
}
}
impl Deref for DisplayGroupSubscription {
type Target = Subscription<DisplayGroupUpdate>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<'a> IntoIterator for &'a DisplayGroupSubscription {
type Item = Result<crate::subscriptions::SubscriptionItem<DisplayGroupUpdate>, crate::Error>;
type IntoIter = <&'a Subscription<DisplayGroupUpdate> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
(&self.inner).into_iter()
}
}
impl IntoIterator for DisplayGroupSubscription {
type Item = Result<crate::subscriptions::SubscriptionItem<DisplayGroupUpdate>, crate::Error>;
type IntoIter = <Subscription<DisplayGroupUpdate> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.inner.into_iter()
}
}
impl Client {
pub fn subscribe_to_group_events(&self, group_id: i32) -> Result<DisplayGroupSubscription, Error> {
let builder = self.request();
let request = encoders::encode_subscribe_to_group_events(builder.request_id(), group_id)?;
let inner = builder.send(request)?;
Ok(DisplayGroupSubscription {
inner,
message_bus: self.message_bus.clone(),
})
}
}
#[cfg(test)]
#[path = "sync_tests.rs"]
mod tests;