From 4b70407bcd1e7bd4415bc5e39f906aee221a5c8d Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Wed, 26 Apr 2023 16:05:03 +0200 Subject: [PATCH] feat(sdk): `SlidingSyncBuilder` implements `Clone`. --- crates/matrix-sdk/src/sliding_sync/builder.rs | 39 +++++++++++-------- .../src/sliding_sync/list/builder.rs | 2 +- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/crates/matrix-sdk/src/sliding_sync/builder.rs b/crates/matrix-sdk/src/sliding_sync/builder.rs index 559bfa2b4..0b28df18b 100644 --- a/crates/matrix-sdk/src/sliding_sync/builder.rs +++ b/crates/matrix-sdk/src/sliding_sync/builder.rs @@ -14,16 +14,12 @@ use ruma::{ events::TimelineEventType, OwnedRoomId, }; -use tokio::sync::{ - mpsc::{channel, Receiver, Sender}, - RwLock as AsyncRwLock, -}; +use tokio::sync::{mpsc::channel, RwLock as AsyncRwLock}; use url::Url; use super::{ cache::restore_sliding_sync_state, Error, SlidingSync, SlidingSyncInner, - SlidingSyncInternalMessage, SlidingSyncList, SlidingSyncListBuilder, - SlidingSyncPositionMarkers, SlidingSyncRoom, + SlidingSyncListBuilder, SlidingSyncPositionMarkers, SlidingSyncRoom, }; use crate::{Client, Result}; @@ -31,16 +27,15 @@ use crate::{Client, Result}; /// /// Get a new builder with methods like [`crate::Client::sliding_sync`], or /// [`crate::SlidingSync::builder`]. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct SlidingSyncBuilder { storage_key: Option, homeserver: Option, client: Option, - lists: BTreeMap, + lists: Vec, bump_event_types: Vec, extensions: Option, subscriptions: BTreeMap, - internal_channel: (Sender, Receiver), } impl SlidingSyncBuilder { @@ -49,11 +44,10 @@ impl SlidingSyncBuilder { storage_key: None, homeserver: None, client: None, - lists: BTreeMap::new(), + lists: Vec::new(), bump_event_types: Vec::new(), extensions: None, subscriptions: BTreeMap::new(), - internal_channel: channel(8), } } @@ -79,9 +73,7 @@ impl SlidingSyncBuilder { /// /// Replace any list with the name. pub fn add_list(mut self, list_builder: SlidingSyncListBuilder) -> Result { - let list = list_builder.build(self.internal_channel.0.clone())?; - - self.lists.insert(list.name().to_owned(), list); + self.lists.push(list_builder); Ok(self) } @@ -223,12 +215,22 @@ impl SlidingSyncBuilder { let mut delta_token = None; let mut rooms_found: BTreeMap = BTreeMap::new(); + let (internal_channel_sender, internal_channel_receiver) = channel(8); + + let mut lists = BTreeMap::new(); + + for list_builder in self.lists { + let list = list_builder.build(internal_channel_sender.clone())?; + + lists.insert(list.name().to_owned(), list); + } + // Load an existing state from the cache. if let Some(storage_key) = &self.storage_key { restore_sliding_sync_state( &client, storage_key, - &mut self.lists, + &mut lists, &mut delta_token, &mut rooms_found, &mut self.extensions, @@ -237,7 +239,7 @@ impl SlidingSyncBuilder { } let rooms = StdRwLock::new(rooms_found); - let lists = StdRwLock::new(self.lists); + let lists = StdRwLock::new(lists); Ok(SlidingSync::new(SlidingSyncInner { homeserver: self.homeserver, @@ -259,7 +261,10 @@ impl SlidingSyncBuilder { subscriptions: StdRwLock::new(self.subscriptions), unsubscribe: Default::default(), - internal_channel: (self.internal_channel.0, AsyncRwLock::new(self.internal_channel.1)), + internal_channel: ( + internal_channel_sender, + AsyncRwLock::new(internal_channel_receiver), + ), })) } } diff --git a/crates/matrix-sdk/src/sliding_sync/list/builder.rs b/crates/matrix-sdk/src/sliding_sync/list/builder.rs index 4b8459999..e6e7ff710 100644 --- a/crates/matrix-sdk/src/sliding_sync/list/builder.rs +++ b/crates/matrix-sdk/src/sliding_sync/list/builder.rs @@ -17,7 +17,7 @@ use crate::Result; pub const FULL_SYNC_LIST_NAME: &str = "full-sync"; /// Builder for [`SlidingSyncList`]. -#[derive(Clone, Debug)] +#[derive(Debug, Clone)] pub struct SlidingSyncListBuilder { sync_mode: SlidingSyncMode, sort: Vec,