From 0082fbc0b41bb7f56e3957342cba58f36093b04c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Wed, 25 Sep 2024 13:31:43 +0200 Subject: [PATCH] ffi: add `EventTimelineItemDebugInfoProvider` to lazily retrieve an event's debug info --- bindings/matrix-sdk-ffi/src/room_list.rs | 2 +- bindings/matrix-sdk-ffi/src/timeline/mod.rs | 26 +++++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/bindings/matrix-sdk-ffi/src/room_list.rs b/bindings/matrix-sdk-ffi/src/room_list.rs index df6926bc8..7b518ec93 100644 --- a/bindings/matrix-sdk-ffi/src/room_list.rs +++ b/bindings/matrix-sdk-ffi/src/room_list.rs @@ -703,7 +703,7 @@ impl RoomListItem { } async fn latest_event(&self) -> Option { - self.inner.latest_event().await.map(|e| e.into()) + self.inner.latest_event().await.map(Into::into) } } diff --git a/bindings/matrix-sdk-ffi/src/timeline/mod.rs b/bindings/matrix-sdk-ffi/src/timeline/mod.rs index 3d0b6224e..ed8c2e4a2 100644 --- a/bindings/matrix-sdk-ffi/src/timeline/mod.rs +++ b/bindings/matrix-sdk-ffi/src/timeline/mod.rs @@ -1032,7 +1032,7 @@ pub struct EventTimelineItem { content: TimelineItemContent, timestamp: u64, reactions: Vec, - debug_info: EventTimelineItemDebugInfo, + debug_info_provider: Arc, local_send_state: Option, read_receipts: HashMap, origin: Option, @@ -1056,11 +1056,7 @@ impl From for EventTimelineItem { .collect(), }) .collect(); - let debug_info = EventTimelineItemDebugInfo { - model: format!("{:#?}", value), - original_json: value.original_json().map(|raw| raw.json().get().to_owned()), - latest_edit_json: value.latest_edit_json().map(|raw| raw.json().get().to_owned()), - }; + let debug_info_provider = Arc::new(EventTimelineItemDebugInfoProvider(value.clone())); let read_receipts = value.read_receipts().iter().map(|(k, v)| (k.to_string(), v.clone().into())).collect(); Self { @@ -1075,7 +1071,7 @@ impl From for EventTimelineItem { content: value.content().clone().into(), timestamp: value.timestamp().0.into(), reactions, - debug_info, + debug_info_provider, local_send_state: value.send_state().map(|s| s.into()), read_receipts, origin: value.origin(), @@ -1096,6 +1092,22 @@ impl From for Receipt { } } +/// Wrapper to retrieve the debug info lazily instead of immediately +/// transforming it for each timeline event. +#[derive(uniffi::Object)] +pub struct EventTimelineItemDebugInfoProvider(matrix_sdk_ui::timeline::EventTimelineItem); + +#[uniffi::export] +impl EventTimelineItemDebugInfoProvider { + fn get(&self) -> EventTimelineItemDebugInfo { + EventTimelineItemDebugInfo { + model: format!("{:#?}", self.0), + original_json: self.0.original_json().map(|raw| raw.json().get().to_owned()), + latest_edit_json: self.0.latest_edit_json().map(|raw| raw.json().get().to_owned()), + } + } +} + #[derive(Clone, uniffi::Record)] pub struct EventTimelineItemDebugInfo { model: String,