From 91e9942fcdc4e3ade5d5982d93dc4ff672bbd5ff Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Thu, 23 Mar 2023 11:15:24 +0100 Subject: [PATCH] feat(sdk): Export `FrozenSlidingSyncList` into its own module. --- .../src/sliding_sync/list/frozen.rs | 125 ++++++++++++++++++ .../matrix-sdk/src/sliding_sync/list/mod.rs | 125 +----------------- 2 files changed, 128 insertions(+), 122 deletions(-) create mode 100644 crates/matrix-sdk/src/sliding_sync/list/frozen.rs diff --git a/crates/matrix-sdk/src/sliding_sync/list/frozen.rs b/crates/matrix-sdk/src/sliding_sync/list/frozen.rs new file mode 100644 index 000000000..b549be34e --- /dev/null +++ b/crates/matrix-sdk/src/sliding_sync/list/frozen.rs @@ -0,0 +1,125 @@ +use std::collections::BTreeMap; + +use imbl::Vector; +use ruma::OwnedRoomId; +use serde::{Deserialize, Serialize}; + +use super::{FrozenSlidingSyncRoom, RoomListEntry, SlidingSyncList, SlidingSyncRoom}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct FrozenSlidingSyncList { + #[serde(default, rename = "rooms_count", skip_serializing_if = "Option::is_none")] + pub maximum_number_of_rooms: Option, + #[serde(default, skip_serializing_if = "Vector::is_empty")] + pub rooms_list: Vector, + #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] + pub(in super::super) rooms: BTreeMap, +} + +impl FrozenSlidingSyncList { + pub(in super::super) fn freeze( + source_list: &SlidingSyncList, + rooms_map: &BTreeMap, + ) -> Self { + let mut rooms = BTreeMap::new(); + let mut rooms_list = Vector::new(); + + for room_list_entry in source_list.inner.rooms_list.read().unwrap().iter() { + match room_list_entry { + RoomListEntry::Filled(room_id) | RoomListEntry::Invalidated(room_id) => { + rooms.insert( + room_id.clone(), + rooms_map.get(room_id).expect("room doesn't exist").into(), + ); + } + + _ => {} + }; + + rooms_list.push_back(room_list_entry.freeze_by_ref()); + } + + FrozenSlidingSyncList { + maximum_number_of_rooms: source_list.maximum_number_of_rooms(), + rooms_list, + rooms, + } + } +} + +#[cfg(test)] +mod tests { + use imbl::vector; + use matrix_sdk_base::deserialized_responses::TimelineEvent; + use ruma::{ + api::client::sync::sync_events::v4, events::room::message::RoomMessageEventContent, + room_id, serde::Raw, + }; + use serde_json::json; + + use super::*; + + #[test] + fn test_frozen_sliding_sync_list_serialization() { + assert_eq!( + serde_json::to_value(&FrozenSlidingSyncList { + maximum_number_of_rooms: Some(42), + rooms_list: vector![RoomListEntry::Empty], + rooms: { + let mut rooms = BTreeMap::new(); + rooms.insert( + room_id!("!foo:bar.org").to_owned(), + FrozenSlidingSyncRoom { + room_id: room_id!("!foo:bar.org").to_owned(), + inner: v4::SlidingSyncRoom::default(), + prev_batch: Some("let it go!".to_owned()), + timeline_queue: vector![TimelineEvent::new( + Raw::new(&json!({ + "content": RoomMessageEventContent::text_plain("let it gooo!"), + "type": "m.room.message", + "event_id": "$xxxxx:example.org", + "room_id": "!someroom:example.com", + "origin_server_ts": 2189, + "sender": "@bob:example.com", + })) + .unwrap() + .cast(), + ) + .into()], + }, + ); + + rooms + }, + }) + .unwrap(), + json!({ + "rooms_count": 42, + "rooms_list": ["Empty"], + "rooms": { + "!foo:bar.org": { + "room_id": "!foo:bar.org", + "inner": {}, + "prev_batch": "let it go!", + "timeline": [ + { + "event": { + "content": { + "body": "let it gooo!", + "msgtype": "m.text", + }, + "event_id": "$xxxxx:example.org", + "origin_server_ts": 2189, + "room_id": "!someroom:example.com", + "sender": "@bob:example.com", + "type": "m.room.message", + }, + "encryption_info": null, + } + ], + }, + }, + }) + ); + } +} diff --git a/crates/matrix-sdk/src/sliding_sync/list/mod.rs b/crates/matrix-sdk/src/sliding_sync/list/mod.rs index 3c22977de..0de4cf813 100644 --- a/crates/matrix-sdk/src/sliding_sync/list/mod.rs +++ b/crates/matrix-sdk/src/sliding_sync/list/mod.rs @@ -1,9 +1,9 @@ mod builder; +mod frozen; mod request_generator; use std::{ cmp::min, - collections::BTreeMap, fmt::Debug, iter, sync::{ @@ -15,6 +15,7 @@ use std::{ pub use builder::*; use eyeball::unique::Observable; use eyeball_im::{ObservableVector, VectorDiff}; +pub(super) use frozen::FrozenSlidingSyncList; use futures_core::Stream; use imbl::Vector; pub(super) use request_generator::*; @@ -595,47 +596,6 @@ impl SlidingSyncListInner { } } -#[derive(Debug, Serialize, Deserialize)] -pub(super) struct FrozenSlidingSyncList { - #[serde(default, rename = "rooms_count", skip_serializing_if = "Option::is_none")] - pub(super) maximum_number_of_rooms: Option, - #[serde(default, skip_serializing_if = "Vector::is_empty")] - pub(super) rooms_list: Vector, - #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] - pub(super) rooms: BTreeMap, -} - -impl FrozenSlidingSyncList { - pub(super) fn freeze( - source_list: &SlidingSyncList, - rooms_map: &BTreeMap, - ) -> Self { - let mut rooms = BTreeMap::new(); - let mut rooms_list = Vector::new(); - - for room_list_entry in source_list.inner.rooms_list.read().unwrap().iter() { - match room_list_entry { - RoomListEntry::Filled(room_id) | RoomListEntry::Invalidated(room_id) => { - rooms.insert( - room_id.clone(), - rooms_map.get(room_id).expect("room doesn't exist").into(), - ); - } - - _ => {} - }; - - rooms_list.push_back(room_list_entry.freeze_by_ref()); - } - - FrozenSlidingSyncList { - maximum_number_of_rooms: source_list.maximum_number_of_rooms(), - rooms_list, - rooms, - } - } -} - #[instrument(skip(operations))] fn room_ops( rooms_list: &mut ObservableVector, @@ -899,11 +859,7 @@ mod tests { use std::ops::{Deref, Not}; use imbl::vector; - use matrix_sdk_base::deserialized_responses::TimelineEvent; - use ruma::{ - api::client::sync::sync_events::v4::SlidingOp, assign, - events::room::message::RoomMessageEventContent, room_id, serde::Raw, uint, - }; + use ruma::{api::client::sync::sync_events::v4::SlidingOp, assign, room_id, uint}; use serde_json::json; use super::*; @@ -918,13 +874,6 @@ mod tests { }; } - macro_rules! assert_json_eq { - (from $type:ty: $rust_value:expr => $json_value:expr) => { - let json = serde_json::to_value(&$rust_value).unwrap(); - assert_eq!(json, $json_value); - }; - } - macro_rules! assert_fields_eq { ($left:ident == $right:ident on fields { $( $field:ident $( with $accessor:expr )? ),+ $(,)* } ) => { $( @@ -1608,72 +1557,4 @@ mod tests { assert_json_roundtrip!(from SlidingSyncState: SlidingSyncState::PartiallyLoaded => json!("CatchingUp")); assert_json_roundtrip!(from SlidingSyncState: SlidingSyncState::FullyLoaded => json!("Live")); } - - #[test] - fn test_frozen_sliding_sync_list_serialization() { - // Doing a roundtrip isn't possible because `v4::SlidingSyncRoom` doesn't - // implement `PartialEq`. - assert_json_eq!( - from FrozenSlidingSyncList: - - FrozenSlidingSyncList { - maximum_number_of_rooms: Some(42), - rooms_list: vector![RoomListEntry::Empty], - rooms: { - let mut rooms = BTreeMap::new(); - rooms.insert( - room_id!("!foo:bar.org").to_owned(), - FrozenSlidingSyncRoom { - room_id: room_id!("!foo:bar.org").to_owned(), - inner: v4::SlidingSyncRoom::default(), - prev_batch: Some("let it go!".to_owned()), - timeline_queue: vector![TimelineEvent::new( - Raw::new(&json!({ - "content": RoomMessageEventContent::text_plain("let it gooo!"), - "type": "m.room.message", - "event_id": "$xxxxx:example.org", - "room_id": "!someroom:example.com", - "origin_server_ts": 2189, - "sender": "@bob:example.com", - })) - .unwrap() - .cast(), - ) - .into()], - }, - ); - - rooms - }, - } - => - json!({ - "rooms_count": 42, - "rooms_list": ["Empty"], - "rooms": { - "!foo:bar.org": { - "room_id": "!foo:bar.org", - "inner": {}, - "prev_batch": "let it go!", - "timeline": [ - { - "event": { - "content": { - "body": "let it gooo!", - "msgtype": "m.text", - }, - "event_id": "$xxxxx:example.org", - "origin_server_ts": 2189, - "room_id": "!someroom:example.com", - "sender": "@bob:example.com", - "type": "m.room.message", - }, - "encryption_info": null, - } - ], - }, - }, - }) - ); - } }