use std::ops::{Deref, DerefMut};
use std::sync::Arc;
use crate::client::ClientRequestBuilders;
use crate::subscriptions::Subscription;
use crate::transport::AsyncMessageBus;
use crate::{Client, Error};
use super::common::stream_decoders::DisplayGroupUpdate;
use super::encoders;
#[must_use = "DisplayGroupSubscription must be polled (deref to Subscription, then .next().await) to receive updates; dropping it releases the subscription"]
pub struct DisplayGroupSubscription {
inner: Subscription<DisplayGroupUpdate>,
message_bus: Arc<dyn AsyncMessageBus>,
}
impl DisplayGroupSubscription {
pub async 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).await
}
}
impl Deref for DisplayGroupSubscription {
type Target = Subscription<DisplayGroupUpdate>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl DerefMut for DisplayGroupSubscription {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl Client {
pub async 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::<DisplayGroupUpdate>(request).await?;
Ok(DisplayGroupSubscription {
inner,
message_bus: self.message_bus.clone(),
})
}
}
#[cfg(test)]
#[path = "async_tests.rs"]
mod tests;