Skip to content

Commit 3291940

Browse files
committed
refactor(ffi): use a single provider for lazily computed info
1 parent b002a8d commit 3291940

File tree

1 file changed

+31
-40
lines changed
  • bindings/matrix-sdk-ffi/src/timeline

1 file changed

+31
-40
lines changed

bindings/matrix-sdk-ffi/src/timeline/mod.rs

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,17 +1042,16 @@ pub struct EventTimelineItem {
10421042
content: TimelineItemContent,
10431043
timestamp: u64,
10441044
reactions: Vec<Reaction>,
1045-
debug_info_provider: Arc<EventTimelineItemDebugInfoProvider>,
10461045
local_send_state: Option<EventSendState>,
10471046
read_receipts: HashMap<String, Receipt>,
10481047
origin: Option<EventItemOrigin>,
10491048
can_be_replied_to: bool,
1050-
shields_provider: Arc<EventShieldsProvider>,
1049+
lazy_provider: Arc<LazyTimelineItemProvider>,
10511050
}
10521051

10531052
impl From<matrix_sdk_ui::timeline::EventTimelineItem> for EventTimelineItem {
1054-
fn from(value: matrix_sdk_ui::timeline::EventTimelineItem) -> Self {
1055-
let reactions = value
1053+
fn from(item: matrix_sdk_ui::timeline::EventTimelineItem) -> Self {
1054+
let reactions = item
10561055
.reactions()
10571056
.iter()
10581057
.map(|(k, v)| Reaction {
@@ -1066,27 +1065,25 @@ impl From<matrix_sdk_ui::timeline::EventTimelineItem> for EventTimelineItem {
10661065
.collect(),
10671066
})
10681067
.collect();
1069-
let value = Arc::new(value);
1070-
let debug_info_provider = Arc::new(EventTimelineItemDebugInfoProvider(value.clone()));
1071-
let shields_provider = Arc::new(EventShieldsProvider(value.clone()));
1068+
let item = Arc::new(item);
1069+
let lazy_provider = Arc::new(LazyTimelineItemProvider(item.clone()));
10721070
let read_receipts =
1073-
value.read_receipts().iter().map(|(k, v)| (k.to_string(), v.clone().into())).collect();
1071+
item.read_receipts().iter().map(|(k, v)| (k.to_string(), v.clone().into())).collect();
10741072
Self {
1075-
is_remote: !value.is_local_echo(),
1076-
event_or_transaction_id: value.identifier().into(),
1077-
sender: value.sender().to_string(),
1078-
sender_profile: value.sender_profile().into(),
1079-
is_own: value.is_own(),
1080-
is_editable: value.is_editable(),
1081-
content: value.content().clone().into(),
1082-
timestamp: value.timestamp().0.into(),
1073+
is_remote: !item.is_local_echo(),
1074+
event_or_transaction_id: item.identifier().into(),
1075+
sender: item.sender().to_string(),
1076+
sender_profile: item.sender_profile().into(),
1077+
is_own: item.is_own(),
1078+
is_editable: item.is_editable(),
1079+
content: item.content().clone().into(),
1080+
timestamp: item.timestamp().0.into(),
10831081
reactions,
1084-
debug_info_provider,
1085-
local_send_state: value.send_state().map(|s| s.into()),
1082+
local_send_state: item.send_state().map(|s| s.into()),
10861083
read_receipts,
1087-
origin: value.origin(),
1088-
can_be_replied_to: value.can_be_replied_to(),
1089-
shields_provider,
1084+
origin: item.origin(),
1085+
can_be_replied_to: item.can_be_replied_to(),
1086+
lazy_provider,
10901087
}
10911088
}
10921089
}
@@ -1102,22 +1099,6 @@ impl From<ruma::events::receipt::Receipt> for Receipt {
11021099
}
11031100
}
11041101

1105-
/// Wrapper to retrieve the debug info lazily instead of immediately
1106-
/// transforming it for each timeline event.
1107-
#[derive(uniffi::Object)]
1108-
pub struct EventTimelineItemDebugInfoProvider(Arc<matrix_sdk_ui::timeline::EventTimelineItem>);
1109-
1110-
#[matrix_sdk_ffi_macros::export]
1111-
impl EventTimelineItemDebugInfoProvider {
1112-
fn get(&self) -> EventTimelineItemDebugInfo {
1113-
EventTimelineItemDebugInfo {
1114-
model: format!("{:#?}", self.0),
1115-
original_json: self.0.original_json().map(|raw| raw.json().get().to_owned()),
1116-
latest_edit_json: self.0.latest_edit_json().map(|raw| raw.json().get().to_owned()),
1117-
}
1118-
}
1119-
}
1120-
11211102
#[derive(Clone, uniffi::Record)]
11221103
pub struct EventTimelineItemDebugInfo {
11231104
model: String,
@@ -1269,13 +1250,23 @@ impl TryFrom<EditedContent> for SdkEditedContent {
12691250
}
12701251
}
12711252

1272-
/// Wrapper to retrieve the shields info lazily.
1253+
/// Wrapper to retrieve some timeline item info lazily.
12731254
#[derive(Clone, uniffi::Object)]
1274-
pub struct EventShieldsProvider(Arc<matrix_sdk_ui::timeline::EventTimelineItem>);
1255+
pub struct LazyTimelineItemProvider(Arc<matrix_sdk_ui::timeline::EventTimelineItem>);
12751256

12761257
#[matrix_sdk_ffi_macros::export]
1277-
impl EventShieldsProvider {
1258+
impl LazyTimelineItemProvider {
1259+
/// Returns the shields for this event timeline item.
12781260
fn get_shields(&self, strict: bool) -> Option<ShieldState> {
12791261
self.0.get_shield(strict).map(Into::into)
12801262
}
1263+
1264+
/// Returns some debug information for this event timeline item.
1265+
fn debug_info(&self) -> EventTimelineItemDebugInfo {
1266+
EventTimelineItemDebugInfo {
1267+
model: format!("{:#?}", self.0),
1268+
original_json: self.0.original_json().map(|raw| raw.json().get().to_owned()),
1269+
latest_edit_json: self.0.latest_edit_json().map(|raw| raw.json().get().to_owned()),
1270+
}
1271+
}
12811272
}

0 commit comments

Comments
 (0)