events: Add back relations accessors for message-like event enums

This commit is contained in:
Jonas Platte 2023-04-18 11:33:54 +02:00
parent 0bbad284f3
commit 89e398fd06
No known key found for this signature in database
GPG Key ID: AAA7A61F696C3E0C
4 changed files with 52 additions and 0 deletions

View File

@ -145,6 +145,15 @@ pub struct OriginalSyncMessageLikeEvent<C: MessageLikeEventContent> {
pub unsigned: MessageLikeUnsigned<C>,
}
impl<C: MessageLikeEventContent + RedactContent> OriginalSyncMessageLikeEvent<C>
where
C::Redacted: RedactedMessageLikeEventContent,
{
pub(crate) fn into_maybe_redacted(self) -> SyncMessageLikeEvent<C> {
SyncMessageLikeEvent::Original(self)
}
}
/// A redacted message-like event.
///
/// `RedactedMessageLikeEvent` implements the comparison traits using only the `event_id` field, a

View File

@ -240,6 +240,14 @@ impl<E> BundledMessageLikeRelations<E> {
pub fn is_empty(&self) -> bool {
self.replace.is_none() && self.thread.is_none() && self.reference.is_none()
}
/// Transform `BundledMessageLikeRelations<E>` to `BundledMessageLikeRelations<T>` using the
/// given closure to convert the `replace` field if it is `Some(_)`.
pub(crate) fn map_replace<T>(self, f: impl FnOnce(E) -> T) -> BundledMessageLikeRelations<T> {
let Self { replace, has_invalid_replacement, thread, reference } = self;
let replace = replace.map(|r| Box::new(f(*r)));
BundledMessageLikeRelations { replace, has_invalid_replacement, thread, reference }
}
}
impl<E> Default for BundledMessageLikeRelations<E> {

View File

@ -111,6 +111,12 @@ pub struct OriginalSyncRoomRedactionEvent {
pub unsigned: RoomRedactionUnsigned,
}
impl OriginalSyncRoomRedactionEvent {
pub(crate) fn into_maybe_redacted(self) -> SyncRoomRedactionEvent {
SyncRoomRedactionEvent::Original(self)
}
}
/// Redacted redaction event without a `room_id`.
#[derive(Clone, Debug, Event)]
#[allow(clippy::exhaustive_structs)]

View File

@ -604,6 +604,34 @@ fn expand_accessor_methods(
}
});
let relations_accessor = (kind == EventKind::MessageLike).then(|| {
let variants = variants.iter().map(|v| v.match_arm(quote! { Self }));
quote! {
/// Returns this event's `relations` from inside `unsigned`.
pub fn relations(
&self,
) -> #ruma_common::events::BundledMessageLikeRelations<AnySyncMessageLikeEvent> {
match self {
#(
#variants(event) => event.as_original().map_or_else(
::std::default::Default::default,
|ev| ev.unsigned.relations.clone().map_replace(|r| {
::std::convert::From::from(r.into_maybe_redacted())
}),
),
)*
Self::_Custom(event) => event.as_original().map_or_else(
::std::default::Default::default,
|ev| ev.unsigned.relations.clone().map_replace(|r| {
AnySyncMessageLikeEvent::_Custom(r.into_maybe_redacted())
}),
),
}
}
}
});
let maybe_redacted_accessors = maybe_redacted.then(|| {
let variants = variants.iter().map(|v| v.match_arm(quote! { Self }));
@ -634,6 +662,7 @@ fn expand_accessor_methods(
#content_accessor
#( #methods )*
#relations_accessor
#state_key_accessor
#maybe_redacted_accessors
}