From bdeaa476e2d6461e3e8357f561ed4d69ff031331 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Tue, 15 Aug 2023 20:19:16 +0200 Subject: [PATCH] Add `Composite` bound to automatically call `watch_whole()` on caller object. --- src/gateway.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/gateway.rs b/src/gateway.rs index dd0fc28..886bd3a 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -1,6 +1,6 @@ use crate::errors::GatewayError; use crate::gateway::events::Events; -use crate::types::{self, Channel, ChannelUpdate, Snowflake}; +use crate::types::{self, Channel, ChannelUpdate, Composite, Snowflake}; use crate::types::{UpdateMessage, WebSocketEvent}; use async_trait::async_trait; use std::any::Any; @@ -196,12 +196,13 @@ impl GatewayHandle { .unwrap(); } - pub async fn observe( + pub async fn observe>( &self, object: Arc>, ) -> watch::Receiver>> { let mut store = self.store.lock().await; - if let Some(channel) = store.get(&object.clone().read().unwrap().id()) { + let id = object.read().unwrap().id(); + if let Some(channel) = store.get(&id) { let (_, rx) = channel .downcast_ref::<( watch::Sender>>, @@ -216,18 +217,20 @@ impl GatewayHandle { rx.clone() } else { let id = object.read().unwrap().id(); - let channel = watch::channel(object); + let object = object.read().unwrap().clone(); + let object = object.clone().watch_whole(self).await; + let channel = watch::channel(Arc::new(RwLock::new(object))); let receiver = channel.1.clone(); store.insert(id, Box::new(channel)); receiver } } - pub async fn observe_and_get( + pub async fn observe_and_get>( &self, object: Arc>, ) -> Arc> { - let channel = self.observe(object).await; + let channel = self.observe(object.clone()).await; let object = channel.borrow().clone(); object }