Change observer update ref to &mut from &

This commit is contained in:
kozabrada123 2023-06-10 15:37:02 +02:00
parent d5b883a088
commit 78e63657c8
2 changed files with 10 additions and 7 deletions

View File

@ -17,7 +17,7 @@ pub struct ExampleObserver {}
// One struct can be an observer of multiple websocketevents, if needed // One struct can be an observer of multiple websocketevents, if needed
impl Observer<GatewayReady> for ExampleObserver { impl Observer<GatewayReady> for ExampleObserver {
// After we subscribe to an event this function is called every time we receive it // 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!"); println!("Observed Ready!");
} }
} }

View File

@ -351,8 +351,11 @@ impl Gateway {
let gateway_hello: types::HelloData = let gateway_hello: types::HelloData =
serde_json::from_str(gateway_payload.event_data.unwrap().get()).unwrap(); 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 { let mut gateway = Gateway {
events: Arc::new(Mutex::new(Events::default())), events: shared_events.clone(),
heartbeat_handler: HeartbeatHandler::new( heartbeat_handler: HeartbeatHandler::new(
gateway_hello.heartbeat_interval, gateway_hello.heartbeat_interval,
shared_websocket_send.clone(), shared_websocket_send.clone(),
@ -363,8 +366,6 @@ impl Gateway {
kill_send: kill_send.clone(), 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 // 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 { let handle: JoinHandle<()> = task::spawn(async move {
gateway.gateway_listen_task().await; 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. In this case, the Observable is a [`GatewayEvent`], which is a wrapper around a WebSocketEvent.
*/ */
pub trait Observer<T: types::WebSocketEvent>: std::fmt::Debug { pub trait Observer<T: types::WebSocketEvent>: 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 /** GatewayEvent is a wrapper around a WebSocketEvent. It is used to notify the observers of a
@ -1790,7 +1791,9 @@ impl<T: types::WebSocketEvent> GatewayEvent<T> {
*/ */
async fn notify(&self) { async fn notify(&self) {
for observer in &self.observers { 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)] #[derive(Debug)]
struct Consumer; struct Consumer;
impl Observer<types::GatewayResume> for Consumer { impl Observer<types::GatewayResume> for Consumer {
fn update(&self, data: &types::GatewayResume) { fn update(&mut self, data: &types::GatewayResume) {
println!("{}", data.token) println!("{}", data.token)
} }
} }