Skip to content

Commit 52898fa

Browse files
committed
ffi: create EventOrTransactionId enum for functions that can receive both
1 parent 263386e commit 52898fa

File tree

2 files changed

+52
-13
lines changed

2 files changed

+52
-13
lines changed

bindings/matrix-sdk-ffi/src/event.rs

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
use anyhow::{bail, Context};
2-
use ruma::events::{
3-
room::{message::Relation, redaction::SyncRoomRedactionEvent},
4-
AnySyncMessageLikeEvent, AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent,
5-
MessageLikeEventContent as RumaMessageLikeEventContent, RedactContent,
6-
RedactedStateEventContent, StaticStateEventContent, SyncMessageLikeEvent, SyncStateEvent,
2+
use matrix_sdk::IdParseError;
3+
use matrix_sdk_ui::timeline::TimelineEventItemId;
4+
use ruma::{
5+
events::{
6+
room::{message::Relation, redaction::SyncRoomRedactionEvent},
7+
AnySyncMessageLikeEvent, AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent,
8+
MessageLikeEventContent as RumaMessageLikeEventContent, RedactContent,
9+
RedactedStateEventContent, StaticStateEventContent, SyncMessageLikeEvent, SyncStateEvent,
10+
},
11+
EventId,
712
};
813

914
use crate::{
@@ -350,3 +355,38 @@ impl From<MessageLikeEventType> for ruma::events::MessageLikeEventType {
350355
}
351356
}
352357
}
358+
359+
/// Contains the 2 possible identifiers of an event, either it has a remote
360+
/// event id or a local transaction id, never both or none.
361+
#[derive(Clone, uniffi::Enum)]
362+
pub enum EventOrTransactionId {
363+
EventId { event_id: String },
364+
TransactionId { transaction_id: String },
365+
}
366+
367+
impl From<TimelineEventItemId> for EventOrTransactionId {
368+
fn from(value: TimelineEventItemId) -> Self {
369+
match value {
370+
TimelineEventItemId::EventId(event_id) => {
371+
EventOrTransactionId::EventId { event_id: event_id.to_string() }
372+
}
373+
TimelineEventItemId::TransactionId(transaction_id) => {
374+
EventOrTransactionId::TransactionId { transaction_id: transaction_id.to_string() }
375+
}
376+
}
377+
}
378+
}
379+
380+
impl TryFrom<EventOrTransactionId> for TimelineEventItemId {
381+
type Error = IdParseError;
382+
fn try_from(value: EventOrTransactionId) -> Result<Self, Self::Error> {
383+
match value {
384+
EventOrTransactionId::EventId { event_id } => {
385+
Ok(TimelineEventItemId::EventId(EventId::parse(event_id)?))
386+
}
387+
EventOrTransactionId::TransactionId { transaction_id } => {
388+
Ok(TimelineEventItemId::TransactionId(transaction_id.into()))
389+
}
390+
}
391+
}
392+
}

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ use crate::client_builder::ClientBuilder;
6767
use crate::{
6868
client::ProgressWatcher,
6969
error::{ClientError, RoomError},
70+
event::EventOrTransactionId,
7071
helpers::unwrap_or_clone_arc,
7172
ruma::{
7273
AssetType, AudioInfo, FileInfo, FormattedBody, ImageInfo, PollKind, ThumbnailInfo,
@@ -490,11 +491,11 @@ impl Timeline {
490491
/// local events that are being processed.
491492
pub async fn edit(
492493
&self,
493-
event_or_transaction_id: String,
494+
event_or_transaction_id: EventOrTransactionId,
494495
new_content: EditedContent,
495496
) -> Result<bool, ClientError> {
496497
self.inner
497-
.edit_by_id(&(event_or_transaction_id.into()), new_content.try_into()?)
498+
.edit_by_id(&(event_or_transaction_id.try_into()?), new_content.try_into()?)
498499
.await
499500
.map_err(Into::into)
500501
}
@@ -603,11 +604,11 @@ impl Timeline {
603604
/// Will return an error if the event couldn't be redacted.
604605
pub async fn redact_event(
605606
&self,
606-
event_or_transaction_id: String,
607+
event_or_transaction_id: EventOrTransactionId,
607608
reason: Option<String>,
608609
) -> Result<(), ClientError> {
609610
self.inner
610-
.redact_by_id(&(event_or_transaction_id.into()), reason.as_deref())
611+
.redact_by_id(&(event_or_transaction_id.try_into()?), reason.as_deref())
611612
.await
612613
.map_err(Into::into)
613614
}
@@ -1033,8 +1034,7 @@ impl From<SdkShieldState> for ShieldState {
10331034
pub struct EventTimelineItem {
10341035
is_local: bool,
10351036
is_remote: bool,
1036-
transaction_id: Option<String>,
1037-
event_id: Option<String>,
1037+
event_or_transaction_id: EventOrTransactionId,
10381038
sender: String,
10391039
sender_profile: ProfileDetails,
10401040
is_own: bool,
@@ -1072,8 +1072,7 @@ impl From<matrix_sdk_ui::timeline::EventTimelineItem> for EventTimelineItem {
10721072
Self {
10731073
is_local: value.is_local_echo(),
10741074
is_remote: !value.is_local_echo(),
1075-
transaction_id: value.transaction_id().map(|t| t.to_string()),
1076-
event_id: value.event_id().map(|e| e.to_string()),
1075+
event_or_transaction_id: value.identifier().into(),
10771076
sender: value.sender().to_string(),
10781077
sender_profile: value.sender_profile().into(),
10791078
is_own: value.is_own(),

0 commit comments

Comments
 (0)