events: Introduce AnyRedacted[Sync]RoomEvent

… and use it to implement Redact for Any[Sync]RoomEvent.
This commit is contained in:
Jonas Platte 2021-05-15 13:55:57 +02:00
parent 32ba85b9a2
commit 4aec2d5ff0
No known key found for this signature in database
GPG Key ID: 7D261D771D915378

View File

@ -155,17 +155,6 @@ impl AnyRoomEvent {
room_ev_accessor!(room_id: &RoomId);
room_ev_accessor!(event_id: &EventId);
room_ev_accessor!(sender: &UserId);
/// Redacts `self`, referencing the given event in `unsigned.redacted_because`.
///
/// Does nothing for events that are already redacted.
pub fn redact(self, redaction: SyncRedactionEvent, version: &RoomVersionId) -> Self {
match self {
Self::Message(ev) => Self::RedactedMessage(ev.redact(redaction, version)),
Self::State(ev) => Self::RedactedState(ev.redact(redaction, version)),
Self::RedactedMessage(_) | Self::RedactedState(_) => self,
}
}
}
/// Any sync room event (room event without a `room_id`, as returned in `/sync` responses)
@ -200,17 +189,6 @@ impl AnySyncRoomEvent {
Self::RedactedState(ev) => AnyRoomEvent::RedactedState(ev.into_full_event(room_id)),
}
}
/// Redacts `self`, referencing the given event in `unsigned.redacted_because`.
///
/// Does nothing for events that are already redacted.
pub fn redact(self, redaction: SyncRedactionEvent, version: &RoomVersionId) -> Self {
match self {
Self::Message(ev) => Self::RedactedMessage(ev.redact(redaction, version)),
Self::State(ev) => Self::RedactedState(ev.redact(redaction, version)),
Self::RedactedMessage(_) | Self::RedactedState(_) => self,
}
}
}
impl<'de> de::Deserialize<'de> for AnyRoomEvent {
@ -264,3 +242,75 @@ impl<'de> de::Deserialize<'de> for AnySyncRoomEvent {
}
}
}
/// Any redacted room event.
#[allow(clippy::large_enum_variant)]
#[derive(Clone, Debug)]
pub enum AnyRedactedRoomEvent {
/// Any message event that has been redacted.
Message(AnyRedactedMessageEvent),
/// Any state event that has been redacted.
State(AnyRedactedStateEvent),
}
impl Redact for AnyRoomEvent {
type Redacted = AnyRedactedRoomEvent;
/// Redacts `self`, referencing the given event in `unsigned.redacted_because`.
///
/// Does nothing for events that are already redacted.
fn redact(self, redaction: SyncRedactionEvent, version: &RoomVersionId) -> Self::Redacted {
match self {
Self::Message(ev) => Self::Redacted::Message(ev.redact(redaction, version)),
Self::State(ev) => Self::Redacted::State(ev.redact(redaction, version)),
Self::RedactedMessage(ev) => Self::Redacted::Message(ev),
Self::RedactedState(ev) => Self::Redacted::State(ev),
}
}
}
impl From<AnyRedactedRoomEvent> for AnyRoomEvent {
fn from(ev: AnyRedactedRoomEvent) -> Self {
match ev {
AnyRedactedRoomEvent::Message(ev) => Self::RedactedMessage(ev),
AnyRedactedRoomEvent::State(ev) => Self::RedactedState(ev),
}
}
}
/// Any redacted sync room event (room event without a `room_id`, as returned in `/sync` responses)
#[allow(clippy::large_enum_variant)]
#[derive(Clone, Debug)]
pub enum AnyRedactedSyncRoomEvent {
/// Any sync message event that has been redacted.
Message(AnyRedactedSyncMessageEvent),
/// Any sync state event that has been redacted.
State(AnyRedactedSyncStateEvent),
}
impl Redact for AnySyncRoomEvent {
type Redacted = AnyRedactedSyncRoomEvent;
/// Redacts `self`, referencing the given event in `unsigned.redacted_because`.
///
/// Does nothing for events that are already redacted.
fn redact(self, redaction: SyncRedactionEvent, version: &RoomVersionId) -> Self::Redacted {
match self {
Self::Message(ev) => Self::Redacted::Message(ev.redact(redaction, version)),
Self::State(ev) => Self::Redacted::State(ev.redact(redaction, version)),
Self::RedactedMessage(ev) => Self::Redacted::Message(ev),
Self::RedactedState(ev) => Self::Redacted::State(ev),
}
}
}
impl From<AnyRedactedSyncRoomEvent> for AnySyncRoomEvent {
fn from(ev: AnyRedactedSyncRoomEvent) -> Self {
match ev {
AnyRedactedSyncRoomEvent::Message(ev) => Self::RedactedMessage(ev),
AnyRedactedSyncRoomEvent::State(ev) => Self::RedactedState(ev),
}
}
}