use std::ops::Deref;
use std::sync::Arc;
use crate::client::blocking::{ClientRequestBuilders, Subscription};
use crate::client::sync::Client;
use crate::common::request_helpers::{self, expect_proto};
use crate::transport::MessageBus;
use crate::Error;
use super::common::decoders;
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>,
request_id: i32,
message_bus: Arc<dyn MessageBus>,
}
impl DisplayGroupSubscription {
pub fn update(&self, contract_info: &str) -> Result<(), Error> {
let request = encoders::encode_update_display_group(self.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 display_groups(&self) -> Result<Vec<i32>, Error> {
request_helpers::blocking::one_shot_by_request_id(
self,
encoders::encode_query_display_groups,
expect_proto(decoders::decode_display_group_list_proto),
)
}
pub fn subscribe_to_group_events(&self, group_id: i32) -> Result<DisplayGroupSubscription, Error> {
let builder = self.request();
let request_id = builder.request_id();
let request = encoders::encode_subscribe_to_group_events(request_id, group_id)?;
let inner = builder.send(request)?;
Ok(DisplayGroupSubscription {
inner,
request_id,
message_bus: self.message_bus.clone(),
})
}
}
#[cfg(test)]
#[path = "sync_tests.rs"]
mod tests;