From b77a02662dfc428d60be4dca12478680b89165b7 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Wed, 28 May 2025 13:50:58 +0200 Subject: [PATCH] feat(base): Add `RoomUpdates::iter_all_room_ids`. This patch adds the `RoomUpdates::iter_all_room_ids` method, to iterate over all IDs of rooms that have received an update. --- crates/matrix-sdk-base/src/sync.rs | 74 ++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/crates/matrix-sdk-base/src/sync.rs b/crates/matrix-sdk-base/src/sync.rs index 0e87b0e06..4ca376fde 100644 --- a/crates/matrix-sdk-base/src/sync.rs +++ b/crates/matrix-sdk-base/src/sync.rs @@ -80,6 +80,80 @@ pub struct RoomUpdates { pub knocked: BTreeMap, } +impl RoomUpdates { + /// Iterate over all room IDs, from [`RoomUpdates::left`], + /// [`RoomUpdates::joined`], [`RoomUpdates::invited`] and + /// [`RoomUpdates::knocked`]. + fn iter_all_room_ids(&self) -> impl Iterator { + self.left + .keys() + .chain(self.joined.keys()) + .chain(self.invited.keys()) + .chain(self.knocked.keys()) + } +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeMap; + + use assert_matches::assert_matches; + use ruma::room_id; + + use super::{ + InvitedRoomUpdate, JoinedRoomUpdate, KnockedRoomUpdate, LeftRoomUpdate, RoomUpdates, + }; + + #[test] + fn test_room_updates_iter_all_room_ids() { + let room_id_0 = room_id!("!r0"); + let room_id_1 = room_id!("!r1"); + let room_id_2 = room_id!("!r2"); + let room_id_3 = room_id!("!r3"); + let room_id_4 = room_id!("!r4"); + let room_id_5 = room_id!("!r5"); + let room_id_6 = room_id!("!r6"); + let room_id_7 = room_id!("!r7"); + let room_updates = RoomUpdates { + left: { + let mut left = BTreeMap::new(); + left.insert(room_id_0.to_owned(), LeftRoomUpdate::default()); + left.insert(room_id_1.to_owned(), LeftRoomUpdate::default()); + left + }, + joined: { + let mut joined = BTreeMap::new(); + joined.insert(room_id_2.to_owned(), JoinedRoomUpdate::default()); + joined.insert(room_id_3.to_owned(), JoinedRoomUpdate::default()); + joined + }, + invited: { + let mut invited = BTreeMap::new(); + invited.insert(room_id_4.to_owned(), InvitedRoomUpdate::default()); + invited.insert(room_id_5.to_owned(), InvitedRoomUpdate::default()); + invited + }, + knocked: { + let mut knocked = BTreeMap::new(); + knocked.insert(room_id_6.to_owned(), KnockedRoomUpdate::default()); + knocked.insert(room_id_7.to_owned(), KnockedRoomUpdate::default()); + knocked + }, + }; + + let mut iter = room_updates.iter_all_room_ids(); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_0)); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_1)); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_2)); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_3)); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_4)); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_5)); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_6)); + assert_matches!(iter.next(), Some(room_id) => assert_eq!(room_id, room_id_7)); + assert!(iter.next().is_none()); + } +} + #[cfg(not(tarpaulin_include))] impl fmt::Debug for RoomUpdates { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {