From 10a37f6d511bb56100574ea08b9cbe45f155a2d5 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Thu, 4 Aug 2022 16:57:01 +0200 Subject: [PATCH] chore(sdk): Add EventHandlerDropGuard It isn't used for now, but will be soon. --- crates/matrix-sdk/src/client/mod.rs | 2 +- crates/matrix-sdk/src/event_handler.rs | 36 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/crates/matrix-sdk/src/client/mod.rs b/crates/matrix-sdk/src/client/mod.rs index d0caa62b8..950d38a14 100644 --- a/crates/matrix-sdk/src/client/mod.rs +++ b/crates/matrix-sdk/src/client/mod.rs @@ -2641,7 +2641,7 @@ pub(crate) mod tests { Client::builder().homeserver_url(homeserver).server_versions([MatrixVersion::V1_0]) } - async fn no_retry_test_client(homeserver_url: Option) -> Client { + pub(crate) async fn no_retry_test_client(homeserver_url: Option) -> Client { test_client_builder(homeserver_url) .request_config(RequestConfig::new().disable_retry()) .build() diff --git a/crates/matrix-sdk/src/event_handler.rs b/crates/matrix-sdk/src/event_handler.rs index ecf1b0b71..13e131a87 100644 --- a/crates/matrix-sdk/src/event_handler.rs +++ b/crates/matrix-sdk/src/event_handler.rs @@ -366,6 +366,14 @@ impl Client { EventHandlerHandle { key, handler_id } } + #[allow(dead_code)] + pub(crate) fn event_handler_drop_guard( + &self, + handle: EventHandlerHandle, + ) -> EventHandlerDropGuard { + EventHandlerDropGuard { client: self.clone(), handle } + } + pub(crate) async fn handle_sync_events( &self, kind: EventKind, @@ -514,6 +522,18 @@ impl Client { } } +#[derive(Debug)] +pub(crate) struct EventHandlerDropGuard { + handle: EventHandlerHandle, + client: Client, +} + +impl Drop for EventHandlerDropGuard { + fn drop(&mut self) { + self.client.remove_event_handler(self.handle.clone()); + } +} + macro_rules! impl_event_handler { ($($ty:ident),* $(,)?) => { impl EventHandler for Fun @@ -909,4 +929,20 @@ mod tests { Ok(()) } + + #[async_test] + async fn event_handler_drop_guard() { + let client = crate::client::tests::no_retry_test_client(None).await; + + let handle = client.add_event_handler(|_ev: OriginalSyncRoomMemberEvent| async {}); + assert_eq!(client.event_handlers().len(), 1); + + { + let _guard = client.event_handler_drop_guard(handle); + assert_eq!(client.event_handlers().len(), 1); + // guard dropped here + } + + assert_eq!(client.event_handlers().len(), 0); + } }