From 57d2d934201bedac8e6a87428c66fcf032df5195 Mon Sep 17 00:00:00 2001 From: kozabrada123 <59031733+kozabrada123@users.noreply.github.com> Date: Sat, 10 Jun 2023 15:37:02 +0200 Subject: [PATCH] Change observer update ref to &mut from & --- examples/gateway_observers.rs | 2 +- src/gateway.rs | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/examples/gateway_observers.rs b/examples/gateway_observers.rs index 0920d61..166b84a 100644 --- a/examples/gateway_observers.rs +++ b/examples/gateway_observers.rs @@ -17,7 +17,7 @@ pub struct ExampleObserver {} // One struct can be an observer of multiple websocketevents, if needed impl Observer for ExampleObserver { // After we subscribe to an event this function is called every time we receive it - fn update(&self, _data: &GatewayReady) { + fn update(&mut self, _data: &GatewayReady) { println!("Observed Ready!"); } } diff --git a/src/gateway.rs b/src/gateway.rs index c87b1d8..e49e491 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -351,8 +351,11 @@ impl Gateway { let gateway_hello: types::HelloData = serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); + let events = Events::default(); + let shared_events = Arc::new(Mutex::new(events)); + let mut gateway = Gateway { - events: Arc::new(Mutex::new(Events::default())), + events: shared_events.clone(), heartbeat_handler: HeartbeatHandler::new( gateway_hello.heartbeat_interval, shared_websocket_send.clone(), @@ -363,8 +366,6 @@ impl Gateway { kill_send: kill_send.clone(), }; - let shared_events = gateway.events.clone(); - // Now we can continuously check for messages in a different task, since we aren't going to receive another hello let handle: JoinHandle<()> = task::spawn(async move { gateway.gateway_listen_task().await; @@ -1715,7 +1716,7 @@ an Observable. The Observer is notified when the Observable's data changes. In this case, the Observable is a [`GatewayEvent`], which is a wrapper around a WebSocketEvent. */ pub trait Observer: std::fmt::Debug { - fn update(&self, data: &T); + fn update(&mut self, data: &T); } /** GatewayEvent is a wrapper around a WebSocketEvent. It is used to notify the observers of a @@ -1790,7 +1791,9 @@ impl GatewayEvent { */ async fn notify(&self) { for observer in &self.observers { - observer.lock().await.update(&self.event_data); + let mut observer_lock = observer.lock().await; + observer_lock.update(&self.event_data); + drop(observer_lock); } } } @@ -1962,7 +1965,7 @@ mod example { #[derive(Debug)] struct Consumer; impl Observer for Consumer { - fn update(&self, data: &types::GatewayResume) { + fn update(&mut self, data: &types::GatewayResume) { println!("{}", data.token) } }