atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

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

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
// Copyright 2025 The Matrix.org Foundation C.I.C.
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
// Licensed under the Apache License, Version 2.0 (the "License");
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
// you may not use this file except in compliance with the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
// You may obtain a copy of the License at
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
//     http://www.apache.org/licenses/LICENSE-2.0
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
// Unless required by applicable law or agreed to in writing, software
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
// distributed under the License is distributed on an "AS IS" BASIS,
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
// See the License for that specific language governing permissions and
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
// limitations under the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
use anyhow::{Context, bail};
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
use matrix_sdk::IdParseError;
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
use matrix_sdk_ui::timeline::TimelineEventItemId;
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
use ruma::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
    EventId,
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
    events::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
        AnySyncMessageLikeEvent, AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
        MessageLikeEventContent as RumaMessageLikeEventContent, RedactContent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
        RedactedStateEventContent, StaticStateEventContent, SyncMessageLikeEvent, SyncStateEvent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
        TimelineEventType as RumaTimelineEventType,
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
        room::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
            encrypted,
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
            message::{MessageType as RumaMessageType, Relation},
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
            redaction::SyncRoomRedactionEvent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
use crate::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
    ClientError,
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
    room_member::MembershipState,
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
    ruma::{MessageType, RtcCallIntent, RtcNotificationType},
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
    utils::Timestamp,
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
#[derive(uniffi::Object)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
pub struct TimelineEvent(pub(crate) Box<AnySyncTimelineEvent>);
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
#[matrix_sdk_ffi_macros::export]
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
impl TimelineEvent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
    pub fn event_id(&self) -> String {
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
        self.0.event_id().to_string()
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    pub fn sender_id(&self) -> String {
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
        self.0.sender().to_string()
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
    pub fn timestamp(&self) -> Timestamp {
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
        self.0.origin_server_ts().into()
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    pub fn content(&self) -> Result<TimelineEventContent, ClientError> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
        let content = match &*self.0 {
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
            AnySyncTimelineEvent::MessageLike(event) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
                TimelineEventContent::MessageLike { content: event.clone().try_into()? }
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
            AnySyncTimelineEvent::State(event) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
                TimelineEventContent::State { content: event.clone().try_into()? }
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
        };
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
        Ok(content)
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
    /// Returns the thread root event id for the event, if it's part of a
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
    /// thread.
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
    pub fn thread_root_event_id(&self) -> Option<String> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
        match &*self.0 {
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
            AnySyncTimelineEvent::MessageLike(event) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
                match event.original_content().and_then(|content| content.relation()) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
                    Some(encrypted::Relation::Thread(thread)) => Some(thread.event_id.to_string()),
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
                    _ => None,
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
            AnySyncTimelineEvent::State(_) => None,
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
impl From<AnyTimelineEvent> for TimelineEvent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
    fn from(event: AnyTimelineEvent) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
        Self(Box::new(event.into()))
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
/// The timeline event type.
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
#[derive(Clone, uniffi::Enum, PartialEq, Eq, Hash)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
#[uniffi::export(Eq, Hash)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
pub enum TimelineEventType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
    /// The event is a message-like one and should be displayed as such.
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
    MessageLike { value: MessageLikeEventType },
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
    /// The event is a state event, and may or may not be displayed in the
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
    /// timeline.
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
    State { value: StateEventType },
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
impl From<RumaTimelineEventType> for TimelineEventType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
    fn from(value: RumaTimelineEventType) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
        match value {
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
            RumaTimelineEventType::Audio => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
                Self::MessageLike { value: MessageLikeEventType::Audio }
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
            RumaTimelineEventType::File => Self::MessageLike { value: MessageLikeEventType::File },
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
            RumaTimelineEventType::Image => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
                Self::MessageLike { value: MessageLikeEventType::Image }
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
            RumaTimelineEventType::Video => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
                Self::MessageLike { value: MessageLikeEventType::Video }
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
            RumaTimelineEventType::Voice => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
                Self::MessageLike { value: MessageLikeEventType::Voice }
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
            RumaTimelineEventType::Emote => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
                Self::MessageLike { value: MessageLikeEventType::Emote }
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
            RumaTimelineEventType::Encrypted => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
                Self::MessageLike { value: MessageLikeEventType::Encrypted }
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
            RumaTimelineEventType::RoomMessage => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
                Self::MessageLike { value: MessageLikeEventType::RoomMessage }
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
            RumaTimelineEventType::CallAnswer => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
                Self::MessageLike { value: MessageLikeEventType::CallAnswer }
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
            RumaTimelineEventType::CallInvite => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
                Self::MessageLike { value: MessageLikeEventType::CallInvite }
7ff8adafe9e4atagen2026-10-22 12:30 UTC131
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC132
            RumaTimelineEventType::CallHangup => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC133
                Self::MessageLike { value: MessageLikeEventType::CallHangup }
7ff8adafe9e4atagen2026-10-22 12:30 UTC134
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC135
            RumaTimelineEventType::CallCandidates => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC136
                Self::MessageLike { value: MessageLikeEventType::CallCandidates }
7ff8adafe9e4atagen2026-10-22 12:30 UTC137
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC138
            RumaTimelineEventType::CallNegotiate => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC139
                Self::MessageLike { value: MessageLikeEventType::CallNegotiate }
7ff8adafe9e4atagen2026-10-22 12:30 UTC140
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC141
            RumaTimelineEventType::CallReject => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC142
                Self::MessageLike { value: MessageLikeEventType::CallReject }
7ff8adafe9e4atagen2026-10-22 12:30 UTC143
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC144
            RumaTimelineEventType::CallSdpStreamMetadataChanged => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC145
                Self::MessageLike { value: MessageLikeEventType::CallSdpStreamMetadataChanged }
7ff8adafe9e4atagen2026-10-22 12:30 UTC146
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC147
            RumaTimelineEventType::CallSelectAnswer => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC148
                Self::MessageLike { value: MessageLikeEventType::CallSelectAnswer }
7ff8adafe9e4atagen2026-10-22 12:30 UTC149
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC150
            RumaTimelineEventType::KeyVerificationReady => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC151
                Self::MessageLike { value: MessageLikeEventType::KeyVerificationReady }
7ff8adafe9e4atagen2026-10-22 12:30 UTC152
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC153
            RumaTimelineEventType::KeyVerificationStart => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC154
                Self::MessageLike { value: MessageLikeEventType::KeyVerificationStart }
7ff8adafe9e4atagen2026-10-22 12:30 UTC155
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC156
            RumaTimelineEventType::KeyVerificationCancel => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC157
                Self::MessageLike { value: MessageLikeEventType::KeyVerificationCancel }
7ff8adafe9e4atagen2026-10-22 12:30 UTC158
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC159
            RumaTimelineEventType::KeyVerificationAccept => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC160
                Self::MessageLike { value: MessageLikeEventType::KeyVerificationAccept }
7ff8adafe9e4atagen2026-10-22 12:30 UTC161
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC162
            RumaTimelineEventType::KeyVerificationKey => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC163
                Self::MessageLike { value: MessageLikeEventType::KeyVerificationKey }
7ff8adafe9e4atagen2026-10-22 12:30 UTC164
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC165
            RumaTimelineEventType::KeyVerificationMac => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC166
                Self::MessageLike { value: MessageLikeEventType::KeyVerificationMac }
7ff8adafe9e4atagen2026-10-22 12:30 UTC167
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC168
            RumaTimelineEventType::KeyVerificationDone => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC169
                Self::MessageLike { value: MessageLikeEventType::KeyVerificationDone }
7ff8adafe9e4atagen2026-10-22 12:30 UTC170
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC171
            RumaTimelineEventType::Location => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC172
                Self::MessageLike { value: MessageLikeEventType::Location }
7ff8adafe9e4atagen2026-10-22 12:30 UTC173
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC174
            RumaTimelineEventType::Message => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC175
                Self::MessageLike { value: MessageLikeEventType::Message }
7ff8adafe9e4atagen2026-10-22 12:30 UTC176
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC177
            RumaTimelineEventType::PollStart => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC178
                Self::MessageLike { value: MessageLikeEventType::PollStart }
7ff8adafe9e4atagen2026-10-22 12:30 UTC179
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC180
            RumaTimelineEventType::UnstablePollStart => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC181
                Self::MessageLike { value: MessageLikeEventType::UnstablePollStart }
7ff8adafe9e4atagen2026-10-22 12:30 UTC182
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC183
            RumaTimelineEventType::PollResponse => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC184
                Self::MessageLike { value: MessageLikeEventType::PollResponse }
7ff8adafe9e4atagen2026-10-22 12:30 UTC185
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC186
            RumaTimelineEventType::UnstablePollResponse => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC187
                Self::MessageLike { value: MessageLikeEventType::UnstablePollResponse }
7ff8adafe9e4atagen2026-10-22 12:30 UTC188
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC189
            RumaTimelineEventType::PollEnd => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC190
                Self::MessageLike { value: MessageLikeEventType::PollEnd }
7ff8adafe9e4atagen2026-10-22 12:30 UTC191
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC192
            RumaTimelineEventType::UnstablePollEnd => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC193
                Self::MessageLike { value: MessageLikeEventType::UnstablePollEnd }
7ff8adafe9e4atagen2026-10-22 12:30 UTC194
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC195
            RumaTimelineEventType::Beacon => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC196
                Self::MessageLike { value: MessageLikeEventType::Beacon }
7ff8adafe9e4atagen2026-10-22 12:30 UTC197
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC198
            RumaTimelineEventType::Reaction => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC199
                Self::MessageLike { value: MessageLikeEventType::Reaction }
7ff8adafe9e4atagen2026-10-22 12:30 UTC200
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC201
            RumaTimelineEventType::RoomEncrypted => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC202
                Self::MessageLike { value: MessageLikeEventType::RoomEncrypted }
7ff8adafe9e4atagen2026-10-22 12:30 UTC203
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC204
            RumaTimelineEventType::RoomRedaction => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC205
                Self::MessageLike { value: MessageLikeEventType::RoomRedaction }
7ff8adafe9e4atagen2026-10-22 12:30 UTC206
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC207
            RumaTimelineEventType::Sticker => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC208
                Self::MessageLike { value: MessageLikeEventType::Sticker }
7ff8adafe9e4atagen2026-10-22 12:30 UTC209
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC210
            RumaTimelineEventType::CallNotify => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC211
                Self::MessageLike { value: MessageLikeEventType::CallNotify }
7ff8adafe9e4atagen2026-10-22 12:30 UTC212
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC213
            RumaTimelineEventType::RtcNotification => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC214
                Self::MessageLike { value: MessageLikeEventType::RtcNotification }
7ff8adafe9e4atagen2026-10-22 12:30 UTC215
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC216
            RumaTimelineEventType::RtcDecline => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC217
                Self::MessageLike { value: MessageLikeEventType::RtcDecline }
7ff8adafe9e4atagen2026-10-22 12:30 UTC218
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC219
            RumaTimelineEventType::PolicyRuleRoom => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC220
                Self::State { value: StateEventType::PolicyRuleRoom }
7ff8adafe9e4atagen2026-10-22 12:30 UTC221
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC222
            RumaTimelineEventType::PolicyRuleServer => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC223
                Self::State { value: StateEventType::PolicyRuleServer }
7ff8adafe9e4atagen2026-10-22 12:30 UTC224
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC225
            RumaTimelineEventType::PolicyRuleUser => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC226
                Self::State { value: StateEventType::PolicyRuleUser }
7ff8adafe9e4atagen2026-10-22 12:30 UTC227
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC228
            RumaTimelineEventType::RoomAvatar => Self::State { value: StateEventType::RoomAvatar },
7ff8adafe9e4atagen2026-10-22 12:30 UTC229
            RumaTimelineEventType::RoomCanonicalAlias => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC230
                Self::State { value: StateEventType::RoomCanonicalAlias }
7ff8adafe9e4atagen2026-10-22 12:30 UTC231
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC232
            RumaTimelineEventType::RoomCreate => Self::State { value: StateEventType::RoomCreate },
7ff8adafe9e4atagen2026-10-22 12:30 UTC233
            RumaTimelineEventType::RoomEncryption => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC234
                Self::State { value: StateEventType::RoomEncryption }
7ff8adafe9e4atagen2026-10-22 12:30 UTC235
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC236
            RumaTimelineEventType::RoomGuestAccess => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC237
                Self::State { value: StateEventType::RoomGuestAccess }
7ff8adafe9e4atagen2026-10-22 12:30 UTC238
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC239
            RumaTimelineEventType::RoomHistoryVisibility => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC240
                Self::State { value: StateEventType::RoomHistoryVisibility }
7ff8adafe9e4atagen2026-10-22 12:30 UTC241
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC242
            RumaTimelineEventType::RoomJoinRules => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC243
                Self::State { value: StateEventType::RoomJoinRules }
7ff8adafe9e4atagen2026-10-22 12:30 UTC244
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC245
            RumaTimelineEventType::RoomMember => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC246
                Self::State { value: StateEventType::RoomMemberEvent }
7ff8adafe9e4atagen2026-10-22 12:30 UTC247
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC248
            RumaTimelineEventType::RoomLanguage => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC249
                Self::State { value: StateEventType::RoomLanguage }
7ff8adafe9e4atagen2026-10-22 12:30 UTC250
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC251
            RumaTimelineEventType::RoomName => Self::State { value: StateEventType::RoomName },
7ff8adafe9e4atagen2026-10-22 12:30 UTC252
            RumaTimelineEventType::RoomImagePack => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC253
                Self::State { value: StateEventType::RoomImagePack }
7ff8adafe9e4atagen2026-10-22 12:30 UTC254
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC255
            RumaTimelineEventType::RoomPinnedEvents => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC256
                Self::State { value: StateEventType::RoomPinnedEvents }
7ff8adafe9e4atagen2026-10-22 12:30 UTC257
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC258
            RumaTimelineEventType::RoomPowerLevels => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC259
                Self::State { value: StateEventType::RoomPowerLevels }
7ff8adafe9e4atagen2026-10-22 12:30 UTC260
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC261
            RumaTimelineEventType::RoomServerAcl => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC262
                Self::State { value: StateEventType::RoomServerAcl }
7ff8adafe9e4atagen2026-10-22 12:30 UTC263
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC264
            RumaTimelineEventType::RoomThirdPartyInvite => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC265
                Self::State { value: StateEventType::RoomThirdPartyInvite }
7ff8adafe9e4atagen2026-10-22 12:30 UTC266
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC267
            RumaTimelineEventType::RoomTombstone => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC268
                Self::State { value: StateEventType::RoomTombstone }
7ff8adafe9e4atagen2026-10-22 12:30 UTC269
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC270
            RumaTimelineEventType::RoomTopic => Self::State { value: StateEventType::RoomTopic },
7ff8adafe9e4atagen2026-10-22 12:30 UTC271
            RumaTimelineEventType::SpaceChild => Self::State { value: StateEventType::SpaceChild },
7ff8adafe9e4atagen2026-10-22 12:30 UTC272
            RumaTimelineEventType::SpaceParent => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC273
                Self::State { value: StateEventType::SpaceParent }
7ff8adafe9e4atagen2026-10-22 12:30 UTC274
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC275
            RumaTimelineEventType::BeaconInfo => Self::State { value: StateEventType::BeaconInfo },
7ff8adafe9e4atagen2026-10-22 12:30 UTC276
            RumaTimelineEventType::CallMember => Self::State { value: StateEventType::CallMember },
7ff8adafe9e4atagen2026-10-22 12:30 UTC277
            RumaTimelineEventType::MemberHints => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC278
                Self::State { value: StateEventType::MemberHints }
7ff8adafe9e4atagen2026-10-22 12:30 UTC279
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC280
            RumaTimelineEventType::_Custom(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC281
                Self::State { value: StateEventType::Custom { value: value.to_string() } }
7ff8adafe9e4atagen2026-10-22 12:30 UTC282
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC283
            _ => Self::MessageLike { value: MessageLikeEventType::Other(value.to_string()) },
7ff8adafe9e4atagen2026-10-22 12:30 UTC284
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC285
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC286
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC287
7ff8adafe9e4atagen2026-10-22 12:30 UTC288
#[derive(uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC289
// A note about this `allow(clippy::large_enum_variant)`.
7ff8adafe9e4atagen2026-10-22 12:30 UTC290
// In order to reduce the size of `TimelineEventContent`, we would need to
7ff8adafe9e4atagen2026-10-22 12:30 UTC291
// put some parts in a `Box`, or an `Arc`. Sadly, it doesn't play well with
7ff8adafe9e4atagen2026-10-22 12:30 UTC292
// UniFFI. We would need to change the `uniffi::Record` of the subtypes into
7ff8adafe9e4atagen2026-10-22 12:30 UTC293
// `uniffi::Object`, which is a radical change. It would simplify the memory
7ff8adafe9e4atagen2026-10-22 12:30 UTC294
// usage, but it would slow down the performance around the FFI border. Thus,
7ff8adafe9e4atagen2026-10-22 12:30 UTC295
// let's consider this is a false-positive lint in this particular case.
7ff8adafe9e4atagen2026-10-22 12:30 UTC296
#[allow(clippy::large_enum_variant)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC297
pub enum TimelineEventContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC298
    MessageLike { content: MessageLikeEventContent },
7ff8adafe9e4atagen2026-10-22 12:30 UTC299
    State { content: StateEventContent },
7ff8adafe9e4atagen2026-10-22 12:30 UTC300
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC301
7ff8adafe9e4atagen2026-10-22 12:30 UTC302
#[derive(uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC303
pub enum StateEventContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC304
    PolicyRuleRoom,
7ff8adafe9e4atagen2026-10-22 12:30 UTC305
    PolicyRuleServer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC306
    PolicyRuleUser,
7ff8adafe9e4atagen2026-10-22 12:30 UTC307
    RoomAvatar,
7ff8adafe9e4atagen2026-10-22 12:30 UTC308
    RoomCanonicalAlias,
7ff8adafe9e4atagen2026-10-22 12:30 UTC309
    RoomCreate,
7ff8adafe9e4atagen2026-10-22 12:30 UTC310
    RoomEncryption,
7ff8adafe9e4atagen2026-10-22 12:30 UTC311
    RoomGuestAccess,
7ff8adafe9e4atagen2026-10-22 12:30 UTC312
    RoomHistoryVisibility,
7ff8adafe9e4atagen2026-10-22 12:30 UTC313
    RoomJoinRules,
7ff8adafe9e4atagen2026-10-22 12:30 UTC314
    RoomMemberContent { user_id: String, membership_state: MembershipState },
7ff8adafe9e4atagen2026-10-22 12:30 UTC315
    RoomName,
7ff8adafe9e4atagen2026-10-22 12:30 UTC316
    RoomPinnedEvents,
7ff8adafe9e4atagen2026-10-22 12:30 UTC317
    RoomPowerLevels,
7ff8adafe9e4atagen2026-10-22 12:30 UTC318
    RoomServerAcl,
7ff8adafe9e4atagen2026-10-22 12:30 UTC319
    RoomThirdPartyInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC320
    RoomTombstone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC321
    RoomTopic { topic: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC322
    SpaceChild,
7ff8adafe9e4atagen2026-10-22 12:30 UTC323
    SpaceParent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC324
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC325
7ff8adafe9e4atagen2026-10-22 12:30 UTC326
impl TryFrom<AnySyncStateEvent> for StateEventContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC327
    type Error = anyhow::Error;
7ff8adafe9e4atagen2026-10-22 12:30 UTC328
7ff8adafe9e4atagen2026-10-22 12:30 UTC329
    fn try_from(value: AnySyncStateEvent) -> anyhow::Result<Self> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC330
        let event = match value {
7ff8adafe9e4atagen2026-10-22 12:30 UTC331
            AnySyncStateEvent::PolicyRuleRoom(_) => StateEventContent::PolicyRuleRoom,
7ff8adafe9e4atagen2026-10-22 12:30 UTC332
            AnySyncStateEvent::PolicyRuleServer(_) => StateEventContent::PolicyRuleServer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC333
            AnySyncStateEvent::PolicyRuleUser(_) => StateEventContent::PolicyRuleUser,
7ff8adafe9e4atagen2026-10-22 12:30 UTC334
            AnySyncStateEvent::RoomAvatar(_) => StateEventContent::RoomAvatar,
7ff8adafe9e4atagen2026-10-22 12:30 UTC335
            AnySyncStateEvent::RoomCanonicalAlias(_) => StateEventContent::RoomCanonicalAlias,
7ff8adafe9e4atagen2026-10-22 12:30 UTC336
            AnySyncStateEvent::RoomCreate(_) => StateEventContent::RoomCreate,
7ff8adafe9e4atagen2026-10-22 12:30 UTC337
            AnySyncStateEvent::RoomEncryption(_) => StateEventContent::RoomEncryption,
7ff8adafe9e4atagen2026-10-22 12:30 UTC338
            AnySyncStateEvent::RoomGuestAccess(_) => StateEventContent::RoomGuestAccess,
7ff8adafe9e4atagen2026-10-22 12:30 UTC339
            AnySyncStateEvent::RoomHistoryVisibility(_) => StateEventContent::RoomHistoryVisibility,
7ff8adafe9e4atagen2026-10-22 12:30 UTC340
            AnySyncStateEvent::RoomJoinRules(_) => StateEventContent::RoomJoinRules,
7ff8adafe9e4atagen2026-10-22 12:30 UTC341
            AnySyncStateEvent::RoomMember(content) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC342
                let state_key = content.state_key().to_string();
7ff8adafe9e4atagen2026-10-22 12:30 UTC343
                let original_content = get_state_event_original_content(content)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC344
                StateEventContent::RoomMemberContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC345
                    user_id: state_key,
7ff8adafe9e4atagen2026-10-22 12:30 UTC346
                    membership_state: original_content.membership.try_into()?,
7ff8adafe9e4atagen2026-10-22 12:30 UTC347
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC348
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC349
            AnySyncStateEvent::RoomName(_) => StateEventContent::RoomName,
7ff8adafe9e4atagen2026-10-22 12:30 UTC350
            AnySyncStateEvent::RoomPinnedEvents(_) => StateEventContent::RoomPinnedEvents,
7ff8adafe9e4atagen2026-10-22 12:30 UTC351
            AnySyncStateEvent::RoomPowerLevels(_) => StateEventContent::RoomPowerLevels,
7ff8adafe9e4atagen2026-10-22 12:30 UTC352
            AnySyncStateEvent::RoomServerAcl(_) => StateEventContent::RoomServerAcl,
7ff8adafe9e4atagen2026-10-22 12:30 UTC353
            AnySyncStateEvent::RoomThirdPartyInvite(_) => StateEventContent::RoomThirdPartyInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC354
            AnySyncStateEvent::RoomTombstone(_) => StateEventContent::RoomTombstone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC355
            AnySyncStateEvent::RoomTopic(content) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC356
                let content = get_state_event_original_content(content)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC357
7ff8adafe9e4atagen2026-10-22 12:30 UTC358
                StateEventContent::RoomTopic { topic: content.topic }
7ff8adafe9e4atagen2026-10-22 12:30 UTC359
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC360
            AnySyncStateEvent::SpaceChild(_) => StateEventContent::SpaceChild,
7ff8adafe9e4atagen2026-10-22 12:30 UTC361
            AnySyncStateEvent::SpaceParent(_) => StateEventContent::SpaceParent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC362
            _ => bail!("Unsupported state event: {:?}", value.event_type()),
7ff8adafe9e4atagen2026-10-22 12:30 UTC363
        };
7ff8adafe9e4atagen2026-10-22 12:30 UTC364
        Ok(event)
7ff8adafe9e4atagen2026-10-22 12:30 UTC365
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC366
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC367
7ff8adafe9e4atagen2026-10-22 12:30 UTC368
#[derive(uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC369
// A note about this `allow(clippy::large_enum_variant)`.
7ff8adafe9e4atagen2026-10-22 12:30 UTC370
// In order to reduce the size of `MessageLineEventContent`, we would need to
7ff8adafe9e4atagen2026-10-22 12:30 UTC371
// put some parts in a `Box`, or an `Arc`. Sadly, it doesn't play well with
7ff8adafe9e4atagen2026-10-22 12:30 UTC372
// UniFFI. We would need to change the `uniffi::Record` of the subtypes into
7ff8adafe9e4atagen2026-10-22 12:30 UTC373
// `uniffi::Object`, which is a radical change. It would simplify the memory
7ff8adafe9e4atagen2026-10-22 12:30 UTC374
// usage, but it would slow down the performance around the FFI border. Thus,
7ff8adafe9e4atagen2026-10-22 12:30 UTC375
// let's consider this is a false-positive lint in this particular case.
7ff8adafe9e4atagen2026-10-22 12:30 UTC376
#[allow(clippy::large_enum_variant)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC377
pub enum MessageLikeEventContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC378
    CallAnswer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC379
    CallInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC380
    RtcNotification {
7ff8adafe9e4atagen2026-10-22 12:30 UTC381
        notification_type: RtcNotificationType,
7ff8adafe9e4atagen2026-10-22 12:30 UTC382
        /// The timestamp at which this notification is considered invalid.
7ff8adafe9e4atagen2026-10-22 12:30 UTC383
        expiration_ts: Timestamp,
7ff8adafe9e4atagen2026-10-22 12:30 UTC384
        /// Soft indication of whether it is an audio or video call.
7ff8adafe9e4atagen2026-10-22 12:30 UTC385
        call_intent: Option<RtcCallIntent>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC386
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC387
    CallHangup,
7ff8adafe9e4atagen2026-10-22 12:30 UTC388
    CallCandidates,
7ff8adafe9e4atagen2026-10-22 12:30 UTC389
    KeyVerificationReady,
7ff8adafe9e4atagen2026-10-22 12:30 UTC390
    KeyVerificationStart,
7ff8adafe9e4atagen2026-10-22 12:30 UTC391
    KeyVerificationCancel,
7ff8adafe9e4atagen2026-10-22 12:30 UTC392
    KeyVerificationAccept,
7ff8adafe9e4atagen2026-10-22 12:30 UTC393
    KeyVerificationKey,
7ff8adafe9e4atagen2026-10-22 12:30 UTC394
    KeyVerificationMac,
7ff8adafe9e4atagen2026-10-22 12:30 UTC395
    KeyVerificationDone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC396
    Poll {
7ff8adafe9e4atagen2026-10-22 12:30 UTC397
        question: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC398
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC399
    ReactionContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC400
        related_event_id: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC401
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC402
    RoomEncrypted,
7ff8adafe9e4atagen2026-10-22 12:30 UTC403
    RoomMessage {
7ff8adafe9e4atagen2026-10-22 12:30 UTC404
        message_type: MessageType,
7ff8adafe9e4atagen2026-10-22 12:30 UTC405
        in_reply_to_event_id: Option<String>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC406
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC407
    RoomRedaction {
7ff8adafe9e4atagen2026-10-22 12:30 UTC408
        redacted_event_id: Option<String>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC409
        reason: Option<String>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC410
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC411
    Sticker,
7ff8adafe9e4atagen2026-10-22 12:30 UTC412
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC413
7ff8adafe9e4atagen2026-10-22 12:30 UTC414
impl TryFrom<AnySyncMessageLikeEvent> for MessageLikeEventContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC415
    type Error = anyhow::Error;
7ff8adafe9e4atagen2026-10-22 12:30 UTC416
7ff8adafe9e4atagen2026-10-22 12:30 UTC417
    fn try_from(value: AnySyncMessageLikeEvent) -> anyhow::Result<Self> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC418
        let content = match value {
7ff8adafe9e4atagen2026-10-22 12:30 UTC419
            AnySyncMessageLikeEvent::CallAnswer(_) => MessageLikeEventContent::CallAnswer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC420
            AnySyncMessageLikeEvent::CallInvite(_) => MessageLikeEventContent::CallInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC421
            AnySyncMessageLikeEvent::RtcNotification(event) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC422
                let origin_server_ts = event.origin_server_ts();
7ff8adafe9e4atagen2026-10-22 12:30 UTC423
                let original_content = get_message_like_event_original_content(event)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC424
                let expiration_ts = original_content.expiration_ts(origin_server_ts, None).into();
7ff8adafe9e4atagen2026-10-22 12:30 UTC425
                MessageLikeEventContent::RtcNotification {
7ff8adafe9e4atagen2026-10-22 12:30 UTC426
                    notification_type: original_content.notification_type.into(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC427
                    expiration_ts,
7ff8adafe9e4atagen2026-10-22 12:30 UTC428
                    call_intent: original_content.call_intent.map(|intent| intent.into()),
7ff8adafe9e4atagen2026-10-22 12:30 UTC429
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC430
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC431
            AnySyncMessageLikeEvent::CallHangup(_) => MessageLikeEventContent::CallHangup,
7ff8adafe9e4atagen2026-10-22 12:30 UTC432
            AnySyncMessageLikeEvent::CallCandidates(_) => MessageLikeEventContent::CallCandidates,
7ff8adafe9e4atagen2026-10-22 12:30 UTC433
            AnySyncMessageLikeEvent::KeyVerificationReady(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC434
                MessageLikeEventContent::KeyVerificationReady
7ff8adafe9e4atagen2026-10-22 12:30 UTC435
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC436
            AnySyncMessageLikeEvent::KeyVerificationStart(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC437
                MessageLikeEventContent::KeyVerificationStart
7ff8adafe9e4atagen2026-10-22 12:30 UTC438
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC439
            AnySyncMessageLikeEvent::KeyVerificationCancel(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC440
                MessageLikeEventContent::KeyVerificationCancel
7ff8adafe9e4atagen2026-10-22 12:30 UTC441
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC442
            AnySyncMessageLikeEvent::KeyVerificationAccept(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC443
                MessageLikeEventContent::KeyVerificationAccept
7ff8adafe9e4atagen2026-10-22 12:30 UTC444
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC445
            AnySyncMessageLikeEvent::KeyVerificationKey(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC446
                MessageLikeEventContent::KeyVerificationKey
7ff8adafe9e4atagen2026-10-22 12:30 UTC447
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC448
            AnySyncMessageLikeEvent::KeyVerificationMac(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC449
                MessageLikeEventContent::KeyVerificationMac
7ff8adafe9e4atagen2026-10-22 12:30 UTC450
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC451
            AnySyncMessageLikeEvent::KeyVerificationDone(_) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC452
                MessageLikeEventContent::KeyVerificationDone
7ff8adafe9e4atagen2026-10-22 12:30 UTC453
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC454
            AnySyncMessageLikeEvent::UnstablePollStart(content) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC455
                let original_content = get_message_like_event_original_content(content)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC456
                MessageLikeEventContent::Poll {
7ff8adafe9e4atagen2026-10-22 12:30 UTC457
                    question: original_content.poll_start().question.text.clone(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC458
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC459
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC460
            AnySyncMessageLikeEvent::Reaction(content) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC461
                let original_content = get_message_like_event_original_content(content)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC462
                MessageLikeEventContent::ReactionContent {
7ff8adafe9e4atagen2026-10-22 12:30 UTC463
                    related_event_id: original_content.relates_to.event_id.to_string(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC464
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC465
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC466
            AnySyncMessageLikeEvent::RoomEncrypted(_) => MessageLikeEventContent::RoomEncrypted,
7ff8adafe9e4atagen2026-10-22 12:30 UTC467
            AnySyncMessageLikeEvent::RoomMessage(content) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC468
                let original_content = get_message_like_event_original_content(content)?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC469
                let in_reply_to_event_id =
7ff8adafe9e4atagen2026-10-22 12:30 UTC470
                    original_content.relates_to.and_then(|relation| match relation {
7ff8adafe9e4atagen2026-10-22 12:30 UTC471
                        Relation::Reply(reply) => Some(reply.in_reply_to.event_id.to_string()),
7ff8adafe9e4atagen2026-10-22 12:30 UTC472
                        _ => None,
7ff8adafe9e4atagen2026-10-22 12:30 UTC473
                    });
7ff8adafe9e4atagen2026-10-22 12:30 UTC474
                MessageLikeEventContent::RoomMessage {
7ff8adafe9e4atagen2026-10-22 12:30 UTC475
                    message_type: original_content.msgtype.try_into()?,
7ff8adafe9e4atagen2026-10-22 12:30 UTC476
                    in_reply_to_event_id,
7ff8adafe9e4atagen2026-10-22 12:30 UTC477
                }
7ff8adafe9e4atagen2026-10-22 12:30 UTC478
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC479
            AnySyncMessageLikeEvent::RoomRedaction(c) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC480
                let (redacted_event_id, reason) = match c {
7ff8adafe9e4atagen2026-10-22 12:30 UTC481
                    SyncRoomRedactionEvent::Original(o) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC482
                        let id =
7ff8adafe9e4atagen2026-10-22 12:30 UTC483
                            if o.content.redacts.is_some() { o.content.redacts } else { o.redacts };
7ff8adafe9e4atagen2026-10-22 12:30 UTC484
                        (id.map(|id| id.to_string()), o.content.reason)
7ff8adafe9e4atagen2026-10-22 12:30 UTC485
                    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC486
                    SyncRoomRedactionEvent::Redacted(_) => (None, None),
7ff8adafe9e4atagen2026-10-22 12:30 UTC487
                };
7ff8adafe9e4atagen2026-10-22 12:30 UTC488
                MessageLikeEventContent::RoomRedaction { redacted_event_id, reason }
7ff8adafe9e4atagen2026-10-22 12:30 UTC489
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC490
            AnySyncMessageLikeEvent::Sticker(_) => MessageLikeEventContent::Sticker,
7ff8adafe9e4atagen2026-10-22 12:30 UTC491
            _ => bail!("Unsupported Event Type: {:?}", value.event_type()),
7ff8adafe9e4atagen2026-10-22 12:30 UTC492
        };
7ff8adafe9e4atagen2026-10-22 12:30 UTC493
        Ok(content)
7ff8adafe9e4atagen2026-10-22 12:30 UTC494
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC495
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC496
7ff8adafe9e4atagen2026-10-22 12:30 UTC497
fn get_state_event_original_content<C>(event: SyncStateEvent<C>) -> anyhow::Result<C>
7ff8adafe9e4atagen2026-10-22 12:30 UTC498
where
7ff8adafe9e4atagen2026-10-22 12:30 UTC499
    C: StaticStateEventContent + RedactContent + Clone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC500
    <C as RedactContent>::Redacted: RedactedStateEventContent<StateKey = C::StateKey>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC501
{
7ff8adafe9e4atagen2026-10-22 12:30 UTC502
    let original_content =
7ff8adafe9e4atagen2026-10-22 12:30 UTC503
        event.as_original().context("Failed to get original content")?.content.clone();
7ff8adafe9e4atagen2026-10-22 12:30 UTC504
    Ok(original_content)
7ff8adafe9e4atagen2026-10-22 12:30 UTC505
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC506
7ff8adafe9e4atagen2026-10-22 12:30 UTC507
fn get_message_like_event_original_content<C>(event: SyncMessageLikeEvent<C>) -> anyhow::Result<C>
7ff8adafe9e4atagen2026-10-22 12:30 UTC508
where
7ff8adafe9e4atagen2026-10-22 12:30 UTC509
    C: RumaMessageLikeEventContent + RedactContent + Clone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC510
    <C as ruma::events::RedactContent>::Redacted: ruma::events::RedactedMessageLikeEventContent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC511
{
7ff8adafe9e4atagen2026-10-22 12:30 UTC512
    let original_content =
7ff8adafe9e4atagen2026-10-22 12:30 UTC513
        event.as_original().context("Failed to get original content")?.content.clone();
7ff8adafe9e4atagen2026-10-22 12:30 UTC514
    Ok(original_content)
7ff8adafe9e4atagen2026-10-22 12:30 UTC515
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC516
7ff8adafe9e4atagen2026-10-22 12:30 UTC517
#[derive(Clone, uniffi::Enum, PartialEq, Eq, Hash)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC518
pub enum StateEventType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC519
    BeaconInfo,
7ff8adafe9e4atagen2026-10-22 12:30 UTC520
    CallMember,
7ff8adafe9e4atagen2026-10-22 12:30 UTC521
    MemberHints,
7ff8adafe9e4atagen2026-10-22 12:30 UTC522
    PolicyRuleRoom,
7ff8adafe9e4atagen2026-10-22 12:30 UTC523
    PolicyRuleServer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC524
    PolicyRuleUser,
7ff8adafe9e4atagen2026-10-22 12:30 UTC525
    RoomAvatar,
7ff8adafe9e4atagen2026-10-22 12:30 UTC526
    RoomCanonicalAlias,
7ff8adafe9e4atagen2026-10-22 12:30 UTC527
    RoomCreate,
7ff8adafe9e4atagen2026-10-22 12:30 UTC528
    RoomEncryption,
7ff8adafe9e4atagen2026-10-22 12:30 UTC529
    RoomGuestAccess,
7ff8adafe9e4atagen2026-10-22 12:30 UTC530
    RoomHistoryVisibility,
7ff8adafe9e4atagen2026-10-22 12:30 UTC531
    RoomImagePack,
7ff8adafe9e4atagen2026-10-22 12:30 UTC532
    RoomJoinRules,
7ff8adafe9e4atagen2026-10-22 12:30 UTC533
    RoomMemberEvent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC534
    RoomLanguage,
7ff8adafe9e4atagen2026-10-22 12:30 UTC535
    RoomName,
7ff8adafe9e4atagen2026-10-22 12:30 UTC536
    RoomPinnedEvents,
7ff8adafe9e4atagen2026-10-22 12:30 UTC537
    RoomPowerLevels,
7ff8adafe9e4atagen2026-10-22 12:30 UTC538
    RoomServerAcl,
7ff8adafe9e4atagen2026-10-22 12:30 UTC539
    RoomThirdPartyInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC540
    RoomTombstone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC541
    RoomTopic,
7ff8adafe9e4atagen2026-10-22 12:30 UTC542
    SpaceChild,
7ff8adafe9e4atagen2026-10-22 12:30 UTC543
    SpaceParent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC544
    Custom { value: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC545
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC546
7ff8adafe9e4atagen2026-10-22 12:30 UTC547
impl From<StateEventType> for ruma::events::StateEventType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC548
    fn from(val: StateEventType) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC549
        match val {
7ff8adafe9e4atagen2026-10-22 12:30 UTC550
            StateEventType::BeaconInfo => Self::BeaconInfo,
7ff8adafe9e4atagen2026-10-22 12:30 UTC551
            StateEventType::CallMember => Self::CallMember,
7ff8adafe9e4atagen2026-10-22 12:30 UTC552
            StateEventType::MemberHints => Self::MemberHints,
7ff8adafe9e4atagen2026-10-22 12:30 UTC553
            StateEventType::PolicyRuleRoom => Self::PolicyRuleRoom,
7ff8adafe9e4atagen2026-10-22 12:30 UTC554
            StateEventType::PolicyRuleServer => Self::PolicyRuleServer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC555
            StateEventType::PolicyRuleUser => Self::PolicyRuleUser,
7ff8adafe9e4atagen2026-10-22 12:30 UTC556
            StateEventType::RoomAvatar => Self::RoomAvatar,
7ff8adafe9e4atagen2026-10-22 12:30 UTC557
            StateEventType::RoomCanonicalAlias => Self::RoomCanonicalAlias,
7ff8adafe9e4atagen2026-10-22 12:30 UTC558
            StateEventType::RoomCreate => Self::RoomCreate,
7ff8adafe9e4atagen2026-10-22 12:30 UTC559
            StateEventType::RoomEncryption => Self::RoomEncryption,
7ff8adafe9e4atagen2026-10-22 12:30 UTC560
            StateEventType::RoomGuestAccess => Self::RoomGuestAccess,
7ff8adafe9e4atagen2026-10-22 12:30 UTC561
            StateEventType::RoomHistoryVisibility => Self::RoomHistoryVisibility,
7ff8adafe9e4atagen2026-10-22 12:30 UTC562
            StateEventType::RoomImagePack => Self::RoomImagePack,
7ff8adafe9e4atagen2026-10-22 12:30 UTC563
            StateEventType::RoomJoinRules => Self::RoomJoinRules,
7ff8adafe9e4atagen2026-10-22 12:30 UTC564
            StateEventType::RoomLanguage => Self::RoomLanguage,
7ff8adafe9e4atagen2026-10-22 12:30 UTC565
            StateEventType::RoomMemberEvent => Self::RoomMember,
7ff8adafe9e4atagen2026-10-22 12:30 UTC566
            StateEventType::RoomName => Self::RoomName,
7ff8adafe9e4atagen2026-10-22 12:30 UTC567
            StateEventType::RoomPinnedEvents => Self::RoomPinnedEvents,
7ff8adafe9e4atagen2026-10-22 12:30 UTC568
            StateEventType::RoomPowerLevels => Self::RoomPowerLevels,
7ff8adafe9e4atagen2026-10-22 12:30 UTC569
            StateEventType::RoomServerAcl => Self::RoomServerAcl,
7ff8adafe9e4atagen2026-10-22 12:30 UTC570
            StateEventType::RoomThirdPartyInvite => Self::RoomThirdPartyInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC571
            StateEventType::RoomTombstone => Self::RoomTombstone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC572
            StateEventType::RoomTopic => Self::RoomTopic,
7ff8adafe9e4atagen2026-10-22 12:30 UTC573
            StateEventType::SpaceChild => Self::SpaceChild,
7ff8adafe9e4atagen2026-10-22 12:30 UTC574
            StateEventType::SpaceParent => Self::SpaceParent,
7ff8adafe9e4atagen2026-10-22 12:30 UTC575
            StateEventType::Custom { value } => value.into(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC576
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC577
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC578
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC579
7ff8adafe9e4atagen2026-10-22 12:30 UTC580
#[derive(Clone, uniffi::Enum, PartialEq, Eq, Hash)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC581
pub enum MessageLikeEventType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC582
    Audio,
7ff8adafe9e4atagen2026-10-22 12:30 UTC583
    Beacon,
7ff8adafe9e4atagen2026-10-22 12:30 UTC584
    CallAnswer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC585
    CallCandidates,
7ff8adafe9e4atagen2026-10-22 12:30 UTC586
    CallHangup,
7ff8adafe9e4atagen2026-10-22 12:30 UTC587
    CallInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC588
    CallNegotiate,
7ff8adafe9e4atagen2026-10-22 12:30 UTC589
    CallNotify,
7ff8adafe9e4atagen2026-10-22 12:30 UTC590
    CallReject,
7ff8adafe9e4atagen2026-10-22 12:30 UTC591
    CallSdpStreamMetadataChanged,
7ff8adafe9e4atagen2026-10-22 12:30 UTC592
    CallSelectAnswer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC593
    Emote,
7ff8adafe9e4atagen2026-10-22 12:30 UTC594
    Encrypted,
7ff8adafe9e4atagen2026-10-22 12:30 UTC595
    File,
7ff8adafe9e4atagen2026-10-22 12:30 UTC596
    Image,
7ff8adafe9e4atagen2026-10-22 12:30 UTC597
    KeyVerificationAccept,
7ff8adafe9e4atagen2026-10-22 12:30 UTC598
    KeyVerificationCancel,
7ff8adafe9e4atagen2026-10-22 12:30 UTC599
    KeyVerificationDone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC600
    KeyVerificationKey,
7ff8adafe9e4atagen2026-10-22 12:30 UTC601
    KeyVerificationMac,
7ff8adafe9e4atagen2026-10-22 12:30 UTC602
    KeyVerificationReady,
7ff8adafe9e4atagen2026-10-22 12:30 UTC603
    KeyVerificationStart,
7ff8adafe9e4atagen2026-10-22 12:30 UTC604
    Location,
7ff8adafe9e4atagen2026-10-22 12:30 UTC605
    Message,
7ff8adafe9e4atagen2026-10-22 12:30 UTC606
    PollEnd,
7ff8adafe9e4atagen2026-10-22 12:30 UTC607
    PollResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC608
    PollStart,
7ff8adafe9e4atagen2026-10-22 12:30 UTC609
    Reaction,
7ff8adafe9e4atagen2026-10-22 12:30 UTC610
    RoomEncrypted,
7ff8adafe9e4atagen2026-10-22 12:30 UTC611
    RoomMessage,
7ff8adafe9e4atagen2026-10-22 12:30 UTC612
    RoomRedaction,
7ff8adafe9e4atagen2026-10-22 12:30 UTC613
    RtcDecline,
7ff8adafe9e4atagen2026-10-22 12:30 UTC614
    RtcNotification,
7ff8adafe9e4atagen2026-10-22 12:30 UTC615
    Sticker,
7ff8adafe9e4atagen2026-10-22 12:30 UTC616
    UnstablePollEnd,
7ff8adafe9e4atagen2026-10-22 12:30 UTC617
    UnstablePollResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC618
    UnstablePollStart,
7ff8adafe9e4atagen2026-10-22 12:30 UTC619
    Video,
7ff8adafe9e4atagen2026-10-22 12:30 UTC620
    Voice,
7ff8adafe9e4atagen2026-10-22 12:30 UTC621
    Other(String),
7ff8adafe9e4atagen2026-10-22 12:30 UTC622
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC623
7ff8adafe9e4atagen2026-10-22 12:30 UTC624
impl From<MessageLikeEventType> for ruma::events::MessageLikeEventType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC625
    fn from(val: MessageLikeEventType) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC626
        match val {
7ff8adafe9e4atagen2026-10-22 12:30 UTC627
            MessageLikeEventType::Audio => Self::Audio,
7ff8adafe9e4atagen2026-10-22 12:30 UTC628
            MessageLikeEventType::File => Self::File,
7ff8adafe9e4atagen2026-10-22 12:30 UTC629
            MessageLikeEventType::Image => Self::Image,
7ff8adafe9e4atagen2026-10-22 12:30 UTC630
            MessageLikeEventType::Video => Self::Video,
7ff8adafe9e4atagen2026-10-22 12:30 UTC631
            MessageLikeEventType::Voice => Self::Voice,
7ff8adafe9e4atagen2026-10-22 12:30 UTC632
            MessageLikeEventType::Beacon => Self::Beacon,
7ff8adafe9e4atagen2026-10-22 12:30 UTC633
            MessageLikeEventType::CallAnswer => Self::CallAnswer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC634
            MessageLikeEventType::CallCandidates => Self::CallCandidates,
7ff8adafe9e4atagen2026-10-22 12:30 UTC635
            MessageLikeEventType::CallInvite => Self::CallInvite,
7ff8adafe9e4atagen2026-10-22 12:30 UTC636
            MessageLikeEventType::CallHangup => Self::CallHangup,
7ff8adafe9e4atagen2026-10-22 12:30 UTC637
            MessageLikeEventType::CallNegotiate => Self::CallNegotiate,
7ff8adafe9e4atagen2026-10-22 12:30 UTC638
            MessageLikeEventType::CallNotify => Self::CallNotify,
7ff8adafe9e4atagen2026-10-22 12:30 UTC639
            MessageLikeEventType::CallReject => Self::CallReject,
7ff8adafe9e4atagen2026-10-22 12:30 UTC640
            MessageLikeEventType::CallSdpStreamMetadataChanged => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC641
                Self::CallSdpStreamMetadataChanged
7ff8adafe9e4atagen2026-10-22 12:30 UTC642
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC643
            MessageLikeEventType::CallSelectAnswer => Self::CallSelectAnswer,
7ff8adafe9e4atagen2026-10-22 12:30 UTC644
            MessageLikeEventType::Emote => Self::Emote,
7ff8adafe9e4atagen2026-10-22 12:30 UTC645
            MessageLikeEventType::Encrypted => Self::Encrypted,
7ff8adafe9e4atagen2026-10-22 12:30 UTC646
            MessageLikeEventType::KeyVerificationReady => Self::KeyVerificationReady,
7ff8adafe9e4atagen2026-10-22 12:30 UTC647
            MessageLikeEventType::KeyVerificationStart => Self::KeyVerificationStart,
7ff8adafe9e4atagen2026-10-22 12:30 UTC648
            MessageLikeEventType::KeyVerificationCancel => Self::KeyVerificationCancel,
7ff8adafe9e4atagen2026-10-22 12:30 UTC649
            MessageLikeEventType::KeyVerificationAccept => Self::KeyVerificationAccept,
7ff8adafe9e4atagen2026-10-22 12:30 UTC650
            MessageLikeEventType::KeyVerificationKey => Self::KeyVerificationKey,
7ff8adafe9e4atagen2026-10-22 12:30 UTC651
            MessageLikeEventType::KeyVerificationMac => Self::KeyVerificationMac,
7ff8adafe9e4atagen2026-10-22 12:30 UTC652
            MessageLikeEventType::KeyVerificationDone => Self::KeyVerificationDone,
7ff8adafe9e4atagen2026-10-22 12:30 UTC653
            MessageLikeEventType::Location => Self::Location,
7ff8adafe9e4atagen2026-10-22 12:30 UTC654
            MessageLikeEventType::Message => Self::Message,
7ff8adafe9e4atagen2026-10-22 12:30 UTC655
            MessageLikeEventType::Reaction => Self::Reaction,
7ff8adafe9e4atagen2026-10-22 12:30 UTC656
            MessageLikeEventType::RoomEncrypted => Self::RoomEncrypted,
7ff8adafe9e4atagen2026-10-22 12:30 UTC657
            MessageLikeEventType::RoomMessage => Self::RoomMessage,
7ff8adafe9e4atagen2026-10-22 12:30 UTC658
            MessageLikeEventType::RoomRedaction => Self::RoomRedaction,
7ff8adafe9e4atagen2026-10-22 12:30 UTC659
            MessageLikeEventType::RtcDecline => Self::RtcDecline,
7ff8adafe9e4atagen2026-10-22 12:30 UTC660
            MessageLikeEventType::Sticker => Self::Sticker,
7ff8adafe9e4atagen2026-10-22 12:30 UTC661
            MessageLikeEventType::PollEnd => Self::PollEnd,
7ff8adafe9e4atagen2026-10-22 12:30 UTC662
            MessageLikeEventType::PollResponse => Self::PollResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC663
            MessageLikeEventType::PollStart => Self::PollStart,
7ff8adafe9e4atagen2026-10-22 12:30 UTC664
            MessageLikeEventType::RtcNotification => Self::RtcNotification,
7ff8adafe9e4atagen2026-10-22 12:30 UTC665
            MessageLikeEventType::UnstablePollEnd => Self::UnstablePollEnd,
7ff8adafe9e4atagen2026-10-22 12:30 UTC666
            MessageLikeEventType::UnstablePollResponse => Self::UnstablePollResponse,
7ff8adafe9e4atagen2026-10-22 12:30 UTC667
            MessageLikeEventType::UnstablePollStart => Self::UnstablePollStart,
7ff8adafe9e4atagen2026-10-22 12:30 UTC668
            MessageLikeEventType::Other(msgtype) => Self::from(msgtype),
7ff8adafe9e4atagen2026-10-22 12:30 UTC669
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC670
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC671
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC672
7ff8adafe9e4atagen2026-10-22 12:30 UTC673
#[derive(Debug, PartialEq, Clone, uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC674
pub enum RoomMessageEventMessageType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC675
    Audio,
7ff8adafe9e4atagen2026-10-22 12:30 UTC676
    Emote,
7ff8adafe9e4atagen2026-10-22 12:30 UTC677
    File,
7ff8adafe9e4atagen2026-10-22 12:30 UTC678
    #[cfg(feature = "unstable-msc4274")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC679
    Gallery,
7ff8adafe9e4atagen2026-10-22 12:30 UTC680
    Image,
7ff8adafe9e4atagen2026-10-22 12:30 UTC681
    Location,
7ff8adafe9e4atagen2026-10-22 12:30 UTC682
    Notice,
7ff8adafe9e4atagen2026-10-22 12:30 UTC683
    ServerNotice,
7ff8adafe9e4atagen2026-10-22 12:30 UTC684
    Text,
7ff8adafe9e4atagen2026-10-22 12:30 UTC685
    Video,
7ff8adafe9e4atagen2026-10-22 12:30 UTC686
    VerificationRequest,
7ff8adafe9e4atagen2026-10-22 12:30 UTC687
    Other,
7ff8adafe9e4atagen2026-10-22 12:30 UTC688
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC689
7ff8adafe9e4atagen2026-10-22 12:30 UTC690
impl From<RumaMessageType> for RoomMessageEventMessageType {
7ff8adafe9e4atagen2026-10-22 12:30 UTC691
    fn from(val: ruma::events::room::message::MessageType) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC692
        match val {
7ff8adafe9e4atagen2026-10-22 12:30 UTC693
            RumaMessageType::Audio { .. } => Self::Audio,
7ff8adafe9e4atagen2026-10-22 12:30 UTC694
            RumaMessageType::Emote { .. } => Self::Emote,
7ff8adafe9e4atagen2026-10-22 12:30 UTC695
            RumaMessageType::File { .. } => Self::File,
7ff8adafe9e4atagen2026-10-22 12:30 UTC696
            #[cfg(feature = "unstable-msc4274")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC697
            RumaMessageType::Gallery { .. } => Self::Gallery,
7ff8adafe9e4atagen2026-10-22 12:30 UTC698
            RumaMessageType::Image { .. } => Self::Image,
7ff8adafe9e4atagen2026-10-22 12:30 UTC699
            RumaMessageType::Location { .. } => Self::Location,
7ff8adafe9e4atagen2026-10-22 12:30 UTC700
            RumaMessageType::Notice { .. } => Self::Notice,
7ff8adafe9e4atagen2026-10-22 12:30 UTC701
            RumaMessageType::ServerNotice { .. } => Self::ServerNotice,
7ff8adafe9e4atagen2026-10-22 12:30 UTC702
            RumaMessageType::Text { .. } => Self::Text,
7ff8adafe9e4atagen2026-10-22 12:30 UTC703
            RumaMessageType::Video { .. } => Self::Video,
7ff8adafe9e4atagen2026-10-22 12:30 UTC704
            RumaMessageType::VerificationRequest { .. } => Self::VerificationRequest,
7ff8adafe9e4atagen2026-10-22 12:30 UTC705
            _ => Self::Other,
7ff8adafe9e4atagen2026-10-22 12:30 UTC706
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC707
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC708
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC709
7ff8adafe9e4atagen2026-10-22 12:30 UTC710
/// Contains the 2 possible identifiers of an event, either it has a remote
7ff8adafe9e4atagen2026-10-22 12:30 UTC711
/// event id or a local transaction id, never both or none.
7ff8adafe9e4atagen2026-10-22 12:30 UTC712
#[derive(Clone, uniffi::Enum)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC713
pub enum EventOrTransactionId {
7ff8adafe9e4atagen2026-10-22 12:30 UTC714
    EventId { event_id: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC715
    TransactionId { transaction_id: String },
7ff8adafe9e4atagen2026-10-22 12:30 UTC716
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC717
7ff8adafe9e4atagen2026-10-22 12:30 UTC718
impl From<TimelineEventItemId> for EventOrTransactionId {
7ff8adafe9e4atagen2026-10-22 12:30 UTC719
    fn from(value: TimelineEventItemId) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC720
        match value {
7ff8adafe9e4atagen2026-10-22 12:30 UTC721
            TimelineEventItemId::EventId(event_id) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC722
                EventOrTransactionId::EventId { event_id: event_id.to_string() }
7ff8adafe9e4atagen2026-10-22 12:30 UTC723
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC724
            TimelineEventItemId::TransactionId(transaction_id) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC725
                EventOrTransactionId::TransactionId { transaction_id: transaction_id.to_string() }
7ff8adafe9e4atagen2026-10-22 12:30 UTC726
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC727
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC728
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC729
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC730
7ff8adafe9e4atagen2026-10-22 12:30 UTC731
impl TryFrom<EventOrTransactionId> for TimelineEventItemId {
7ff8adafe9e4atagen2026-10-22 12:30 UTC732
    type Error = IdParseError;
7ff8adafe9e4atagen2026-10-22 12:30 UTC733
    fn try_from(value: EventOrTransactionId) -> Result<Self, Self::Error> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC734
        match value {
7ff8adafe9e4atagen2026-10-22 12:30 UTC735
            EventOrTransactionId::EventId { event_id } => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC736
                Ok(TimelineEventItemId::EventId(EventId::parse(event_id)?))
7ff8adafe9e4atagen2026-10-22 12:30 UTC737
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC738
            EventOrTransactionId::TransactionId { transaction_id } => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC739
                Ok(TimelineEventItemId::TransactionId(transaction_id.into()))
7ff8adafe9e4atagen2026-10-22 12:30 UTC740
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC741
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC742
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC743
}