refactor(common): use ruma's RelationType in the extractor functions

This commit is contained in:
Benjamin Bouvier
2026-02-05 16:21:44 +01:00
parent 071f982eed
commit 80920e9ff2
3 changed files with 15 additions and 51 deletions

View File

@@ -19,7 +19,7 @@ use ruma::{
MilliSecondsSinceUnixEpoch, OwnedEventId,
events::{
AnyMessageLikeEventContent, AnySyncMessageLikeEvent, AnySyncTimelineEvent,
relation::BundledThread,
relation::{BundledThread, RelationType},
},
serde::Raw,
};
@@ -27,30 +27,10 @@ use serde::Deserialize;
use crate::deserialized_responses::{ThreadSummary, ThreadSummaryStatus};
/// The type of relation an event has to another one, if any.
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq)]
pub enum RelationsType {
/// The event is part of a thread, and the related event is the thread root.
#[serde(rename = "m.thread")]
Thread,
/// The event is an edit of another event, and the related event is the one
/// being edited.
#[serde(rename = "m.replace")]
Edit,
/// The event is an annotation of (reaction to) another event, and the
/// related event is the one being annotated.
#[serde(rename = "m.annotation")]
Annotation,
/// The event is referencing another event, and the related event is the one
/// being referenced.
#[serde(rename = "m.reference")]
Reference,
}
#[derive(Deserialize)]
struct RelatesTo {
#[serde(rename = "rel_type")]
rel_type: RelationsType,
rel_type: RelationType,
#[serde(rename = "event_id")]
event_id: Option<OwnedEventId>,
}
@@ -74,8 +54,8 @@ pub fn extract_thread_root_from_content(
) -> Option<OwnedEventId> {
let relates_to = content.deserialize_as_unchecked::<SimplifiedContent>().ok()?.relates_to?;
match relates_to.rel_type {
RelationsType::Thread => relates_to.event_id,
RelationsType::Edit | RelationsType::Reference | RelationsType::Annotation => None,
RelationType::Thread => relates_to.event_id,
_ => None,
}
}
@@ -102,16 +82,14 @@ pub fn extract_thread_root(event: &Raw<AnySyncTimelineEvent>) -> Option<OwnedEve
pub fn extract_edit_target(event: &Raw<AnySyncTimelineEvent>) -> Option<OwnedEventId> {
let relates_to = event.get_field::<SimplifiedContent>("content").ok().flatten()?.relates_to?;
match relates_to.rel_type {
RelationsType::Edit => relates_to.event_id,
RelationsType::Thread | RelationsType::Reference | RelationsType::Annotation => None,
RelationType::Replacement => relates_to.event_id,
_ => None,
}
}
/// Try to extract the type and target of a relation, from a raw timeline event,
/// if provided.
pub fn extract_relation(
event: &Raw<AnySyncTimelineEvent>,
) -> Option<(RelationsType, OwnedEventId)> {
pub fn extract_relation(event: &Raw<AnySyncTimelineEvent>) -> Option<(RelationType, OwnedEventId)> {
let relates_to = event.get_field::<SimplifiedContent>("content").ok().flatten()?.relates_to?;
Some((relates_to.rel_type, relates_to.event_id?))
}
@@ -184,7 +162,7 @@ mod tests {
};
use crate::{
deserialized_responses::{ThreadSummary, ThreadSummaryStatus},
serde_helpers::{RelationsType, extract_relation},
serde_helpers::{RelationType, extract_relation},
};
#[test]
@@ -213,7 +191,7 @@ mod tests {
let observed_thread_root = extract_thread_root(&event);
assert_eq!(observed_thread_root.as_deref(), Some(thread_root));
let observed_relation = extract_relation(&event).unwrap();
assert_eq!(observed_relation, (RelationsType::Thread, thread_root.to_owned()));
assert_eq!(observed_relation, (RelationType::Thread, thread_root.to_owned()));
// If the event doesn't have a content for some reason (redacted), it returns
// None.
@@ -269,7 +247,7 @@ mod tests {
let observed_relation = extract_relation(&event).unwrap();
assert_eq!(
observed_relation,
(RelationsType::Reference, owned_event_id!("$referenced_event_id:example.com"))
(RelationType::Reference, owned_event_id!("$referenced_event_id:example.com"))
);
}

View File

@@ -24,7 +24,7 @@ use matrix_sdk_base::{
store::{EventCacheStoreLock, EventCacheStoreLockGuard, EventCacheStoreLockState},
},
linked_chunk::{LinkedChunkId, OwnedLinkedChunkId, Update},
serde_helpers::{RelationsType, extract_relation},
serde_helpers::extract_relation,
task_monitor::BackgroundTaskHandle,
};
#[cfg(feature = "e2e-encryption")]
@@ -557,10 +557,8 @@ impl PinnedEventCache {
// Don't include thread responses in the pinned event chunk.
match rel_type {
RelationsType::Thread => None,
RelationsType::Edit | RelationsType::Annotation | RelationsType::Reference => {
Some(event_id)
}
RelationType::Thread => None,
_ => Some(event_id),
}
}

View File

@@ -46,7 +46,7 @@ use matrix_sdk_base::{
RawAnySyncOrStrippedState, RawSyncOrStrippedState, SyncOrStrippedState,
},
media::{MediaThumbnailSettings, store::IgnoreMediaRetentionPolicy},
serde_helpers::{RelationsType, extract_relation},
serde_helpers::extract_relation,
store::{StateStoreExt, ThreadSubscriptionStatus},
};
#[cfg(feature = "e2e-encryption")]
@@ -886,19 +886,7 @@ impl Room {
let (rel_type, _) = extract_relation(ev.raw())?;
filter
.iter()
.any(|ruma_filter| match ruma_filter {
RelationType::Annotation => {
rel_type == RelationsType::Annotation
}
RelationType::Replacement => {
rel_type == RelationsType::Edit
}
RelationType::Thread => rel_type == RelationsType::Thread,
RelationType::Reference => {
rel_type == RelationsType::Reference
}
_ => false,
})
.any(|ruma_filter| ruma_filter == &rel_type)
.then_some(ev)
}));
} else {