From 702b6194176ec7d985bb080dd7c168764cdba5ad Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Sat, 15 May 2021 13:26:05 +0200 Subject: [PATCH] events: Introduce Redact trait --- crates/ruma-events-macros/src/event_enum.rs | 7 ++++--- crates/ruma-events/src/enums.rs | 2 +- crates/ruma-events/src/lib.rs | 12 ++++++++++++ crates/ruma-events/tests/redacted.rs | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/crates/ruma-events-macros/src/event_enum.rs b/crates/ruma-events-macros/src/event_enum.rs index 1d09c7cf..fe6eb4de 100644 --- a/crates/ruma-events-macros/src/event_enum.rs +++ b/crates/ruma-events-macros/src/event_enum.rs @@ -486,9 +486,10 @@ fn expand_redact( Some(quote! { #[automatically_derived] - impl #ident { - /// Redacts `Self` given a valid `Redaction[Sync]Event`. - pub fn redact( + impl #ruma_events::Redact for #ident { + type Redacted = #redacted_enum; + + fn redact( self, redaction: #ruma_events::room::redaction::SyncRedactionEvent, version: &#ruma_identifiers::RoomVersionId, diff --git a/crates/ruma-events/src/enums.rs b/crates/ruma-events/src/enums.rs index b224e8e9..f325c27d 100644 --- a/crates/ruma-events/src/enums.rs +++ b/crates/ruma-events/src/enums.rs @@ -4,7 +4,7 @@ use ruma_identifiers::{EventId, RoomId, RoomVersionId, UserId}; use serde::{de, Serialize}; use serde_json::value::RawValue as RawJsonValue; -use crate::{from_raw_json_value, room::redaction::SyncRedactionEvent, EventDeHelper}; +use crate::{from_raw_json_value, room::redaction::SyncRedactionEvent, EventDeHelper, Redact}; event_enum! { /// Any global account data event. diff --git a/crates/ruma-events/src/lib.rs b/crates/ruma-events/src/lib.rs index e7c4e61d..3757a809 100644 --- a/crates/ruma-events/src/lib.rs +++ b/crates/ruma-events/src/lib.rs @@ -275,6 +275,18 @@ pub trait EventContent: Sized + Serialize { fn from_parts(event_type: &str, content: Box) -> Result; } +/// Trait to define the behavior of redacting an event. +pub trait Redact { + /// The redacted form of the event. + type Redacted; + + /// Transforms `self` into a redacted form (removing most fields) according to the spec. + /// + /// A small number of events have room-version specific redaction behavior, so a version has to + /// be specified. + fn redact(self, redaction: SyncRedactionEvent, version: &RoomVersionId) -> Self::Redacted; +} + /// Trait to define the behavior of redact an event's content object. pub trait RedactContent { /// The redacted form of the event's content. diff --git a/crates/ruma-events/tests/redacted.rs b/crates/ruma-events/tests/redacted.rs index 02dd6cee..b7c79016 100644 --- a/crates/ruma-events/tests/redacted.rs +++ b/crates/ruma-events/tests/redacted.rs @@ -10,7 +10,7 @@ use ruma_events::{ redaction::{RedactionEventContent, SyncRedactionEvent}, }, AnyMessageEvent, AnyRedactedMessageEvent, AnyRedactedSyncMessageEvent, - AnyRedactedSyncStateEvent, AnyRoomEvent, AnySyncRoomEvent, RedactedMessageEvent, + AnyRedactedSyncStateEvent, AnyRoomEvent, AnySyncRoomEvent, Redact, RedactedMessageEvent, RedactedSyncMessageEvent, RedactedSyncStateEvent, RedactedUnsigned, Unsigned, }; use ruma_identifiers::{event_id, room_id, user_id, RoomVersionId};