diff --git a/crates/ruma-common/CHANGELOG.md b/crates/ruma-common/CHANGELOG.md index 56ab1a47..4f8654c1 100644 --- a/crates/ruma-common/CHANGELOG.md +++ b/crates/ruma-common/CHANGELOG.md @@ -41,6 +41,8 @@ Breaking changes: * Make the `redacted_because` field in `UnsignedRedacted` non-optional and replace parameterless `new` constructor by one that takes a redaction event (like `new_because` previously, which is now removed) +* Move the `Unsigned` associated type from `StateEventContent` to `OriginalStateEventContent` + * `Redacted*EventContent`s don't have an `unsigned` type anymore Improvements: diff --git a/crates/ruma-common/src/events/_custom.rs b/crates/ruma-common/src/events/_custom.rs index b8cd18ab..b26acbfc 100644 --- a/crates/ruma-common/src/events/_custom.rs +++ b/crates/ruma-common/src/events/_custom.rs @@ -3,10 +3,11 @@ use serde_json::value::RawValue as RawJsonValue; use super::{ EphemeralRoomEventContent, EphemeralRoomEventType, EventContent, GlobalAccountDataEventContent, - GlobalAccountDataEventType, MessageLikeEventContent, MessageLikeEventType, RedactContent, - RedactedEventContent, RedactedMessageLikeEventContent, RedactedStateEventContent, - RoomAccountDataEventContent, RoomAccountDataEventType, StateEventContent, StateEventType, - StateUnsigned, ToDeviceEventContent, ToDeviceEventType, + GlobalAccountDataEventType, MessageLikeEventContent, MessageLikeEventType, + OriginalStateEventContent, RedactContent, RedactedEventContent, + RedactedMessageLikeEventContent, RedactedStateEventContent, RoomAccountDataEventContent, + RoomAccountDataEventType, StateEventContent, StateEventType, StateUnsigned, + ToDeviceEventContent, ToDeviceEventType, }; use crate::RoomVersionId; @@ -68,6 +69,8 @@ impl RedactedMessageLikeEventContent for CustomMessageLikeEventContent {} custom_room_event_content!(CustomStateEventContent, StateEventType); impl StateEventContent for CustomStateEventContent { type StateKey = String; +} +impl OriginalStateEventContent for CustomStateEventContent { type Unsigned = StateUnsigned; } impl RedactedStateEventContent for CustomStateEventContent {} diff --git a/crates/ruma-common/src/events/content.rs b/crates/ruma-common/src/events/content.rs index f2de1e88..82ba9bbb 100644 --- a/crates/ruma-common/src/events/content.rs +++ b/crates/ruma-common/src/events/content.rs @@ -6,7 +6,7 @@ use serde_json::value::RawValue as RawJsonValue; use crate::serde::{CanBeEmpty, Raw}; use super::{ - EphemeralRoomEventType, GlobalAccountDataEventType, MessageLikeEventType, + EphemeralRoomEventType, GlobalAccountDataEventType, MessageLikeEventType, RedactContent, RoomAccountDataEventType, StateEventType, StateUnsignedFromParts, ToDeviceEventType, }; @@ -124,7 +124,10 @@ pub trait RedactedMessageLikeEventContent: MessageLikeEventContent + RedactedEve pub trait StateEventContent: EventContent { /// The type of the event's `state_key` field. type StateKey: AsRef + Clone + fmt::Debug + DeserializeOwned + Serialize; +} +/// Content of a non-redacted state event. +pub trait OriginalStateEventContent: StateEventContent + RedactContent { /// The type of the event's `unsigned` field. type Unsigned: Clone + fmt::Debug + Default + CanBeEmpty + StateUnsignedFromParts; } diff --git a/crates/ruma-common/src/events/kinds.rs b/crates/ruma-common/src/events/kinds.rs index ba67dcea..eedb9ab3 100644 --- a/crates/ruma-common/src/events/kinds.rs +++ b/crates/ruma-common/src/events/kinds.rs @@ -6,8 +6,8 @@ use serde_json::value::RawValue as RawJsonValue; use super::{ EphemeralRoomEventContent, EventContent, GlobalAccountDataEventContent, - MessageLikeEventContent, MessageLikeEventType, MessageLikeUnsigned, RedactContent, - RedactedMessageLikeEventContent, RedactedStateEventContent, RedactedUnsigned, + MessageLikeEventContent, MessageLikeEventType, MessageLikeUnsigned, OriginalStateEventContent, + RedactContent, RedactedMessageLikeEventContent, RedactedStateEventContent, RedactedUnsigned, RedactionDeHelper, RoomAccountDataEventContent, StateEventContent, StateEventType, ToDeviceEventContent, }; @@ -229,7 +229,7 @@ where /// `OriginalStateEvent` implements the comparison traits using only the `event_id` field, a sorted /// list would be sorted lexicographically based on the event's `EventId`. #[derive(Clone, Debug, Event)] -pub struct OriginalStateEvent { +pub struct OriginalStateEvent { /// Data specific to the event type. pub content: C, @@ -260,7 +260,7 @@ pub struct OriginalStateEvent { /// `OriginalSyncStateEvent` implements the comparison traits using only the `event_id` field, a /// sorted list would be sorted lexicographically based on the event's `EventId`. #[derive(Clone, Debug, Event)] -pub struct OriginalSyncStateEvent { +pub struct OriginalSyncStateEvent { /// Data specific to the event type. pub content: C, @@ -379,7 +379,7 @@ pub struct RedactedSyncStateEvent { /// would be sorted lexicographically based on the event's `EventId`. #[allow(clippy::exhaustive_enums)] #[derive(Clone, Debug)] -pub enum StateEvent +pub enum StateEvent where C::Redacted: RedactedStateEventContent, { @@ -396,7 +396,7 @@ where /// would be sorted lexicographically based on the event's `EventId`. #[allow(clippy::exhaustive_enums)] #[derive(Clone, Debug)] -pub enum SyncStateEvent +pub enum SyncStateEvent where C::Redacted: RedactedStateEventContent, { @@ -617,7 +617,7 @@ impl_possibly_redacted_event!( ); impl_possibly_redacted_event!( - StateEvent(StateEventContent, RedactedStateEventContent, StateEventType) + StateEvent(OriginalStateEventContent, RedactedStateEventContent, StateEventType) where C::Redacted: StateEventContent, { @@ -648,7 +648,7 @@ impl_possibly_redacted_event!( ); impl_possibly_redacted_event!( - SyncStateEvent(StateEventContent, RedactedStateEventContent, StateEventType) + SyncStateEvent(OriginalStateEventContent, RedactedStateEventContent, StateEventType) where C::Redacted: StateEventContent, { @@ -701,4 +701,9 @@ impl_sync_from_full!( MessageLikeEventContent, RedactedMessageLikeEventContent ); -impl_sync_from_full!(SyncStateEvent, StateEvent, StateEventContent, RedactedStateEventContent); +impl_sync_from_full!( + SyncStateEvent, + StateEvent, + OriginalStateEventContent, + RedactedStateEventContent +); diff --git a/crates/ruma-common/src/events/room/aliases.rs b/crates/ruma-common/src/events/room/aliases.rs index 26dd13ae..7dfe5da5 100644 --- a/crates/ruma-common/src/events/room/aliases.rs +++ b/crates/ruma-common/src/events/room/aliases.rs @@ -7,7 +7,7 @@ use serde_json::value::RawValue as RawJsonValue; use crate::{ events::{ EventContent, RedactContent, RedactedEventContent, RedactedStateEventContent, - StateEventContent, StateEventType, StateUnsigned, + StateEventContent, StateEventType, }, OwnedRoomAliasId, OwnedServerName, RoomVersionId, }; @@ -97,8 +97,6 @@ impl EventContent for RedactedRoomAliasesEventContent { impl StateEventContent for RedactedRoomAliasesEventContent { type StateKey = OwnedServerName; - // FIXME: Not actually used - type Unsigned = StateUnsigned; } impl RedactedStateEventContent for RedactedRoomAliasesEventContent {} diff --git a/crates/ruma-common/src/events/room/member.rs b/crates/ruma-common/src/events/room/member.rs index 8fea4b22..9f85cc6f 100644 --- a/crates/ruma-common/src/events/room/member.rs +++ b/crates/ruma-common/src/events/room/member.rs @@ -12,8 +12,8 @@ use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue}; use crate::{ events::{ AnyStrippedStateEvent, BundledRelations, EventContent, RedactContent, RedactedEventContent, - RedactedStateEventContent, StateEventContent, StateEventType, StateUnsigned, - StateUnsignedFromParts, StaticEventContent, + RedactedStateEventContent, StateEventContent, StateEventType, StateUnsignedFromParts, + StaticEventContent, }, serde::{CanBeEmpty, Raw, StringEnum}, OwnedMxcUri, OwnedServerName, OwnedServerSigningKeyId, OwnedTransactionId, OwnedUserId, @@ -252,8 +252,6 @@ impl EventContent for RedactedRoomMemberEventContent { impl StateEventContent for RedactedRoomMemberEventContent { type StateKey = OwnedUserId; - // FIXME: Not actually used - type Unsigned = StateUnsigned; } impl RedactedStateEventContent for RedactedRoomMemberEventContent {} diff --git a/crates/ruma-macros/src/events/event_content.rs b/crates/ruma-macros/src/events/event_content.rs index 2cb05c12..d780ceaf 100644 --- a/crates/ruma-macros/src/events/event_content.rs +++ b/crates/ruma-macros/src/events/event_content.rs @@ -316,6 +316,7 @@ pub fn expand_event_content( unsigned_type, &aliases, ruma_common, + true, ) .unwrap_or_else(syn::Error::into_compile_error); let static_event_content_impl = event_kind @@ -407,6 +408,7 @@ fn generate_redacted_event_content<'a>( unsigned_type, aliases, ruma_common, + false, ) .unwrap_or_else(syn::Error::into_compile_error); @@ -584,6 +586,7 @@ fn generate_event_content_impl<'a>( unsigned_type: Option, aliases: &[LitStr], ruma_common: &TokenStream, + is_original: bool, ) -> syn::Result { let serde = quote! { #ruma_common::exports::serde }; let serde_json = quote! { #ruma_common::exports::serde_json }; @@ -667,20 +670,34 @@ fn generate_event_content_impl<'a>( let state_event_content_impl = (event_kind == Some(EventKind::State)).then(|| { assert!(state_key_type.is_some()); - let unsigned_type = unsigned_type - .unwrap_or_else(|| quote! { #ruma_common::events::StateUnsigned }); quote! { type StateKey = #state_key_type; - type Unsigned = #unsigned_type; } }); + let original_state_event_content_impl = + (event_kind == Some(EventKind::State) && is_original).then(|| { + let trait_name = format_ident!("Original{kind}Content"); + + let unsigned_type = unsigned_type + .unwrap_or_else(|| quote! { #ruma_common::events::StateUnsigned }); + + quote! { + #[automatically_derived] + impl #ruma_common::events::#trait_name for #ident { + type Unsigned = #unsigned_type; + } + } + }); + quote! { #[automatically_derived] impl #ruma_common::events::#trait_name for #ident { #state_event_content_impl } + + #original_state_event_content_impl } }); diff --git a/crates/ruma-macros/src/events/event_enum.rs b/crates/ruma-macros/src/events/event_enum.rs index b22e25a7..a52c06b4 100644 --- a/crates/ruma-macros/src/events/event_enum.rs +++ b/crates/ruma-macros/src/events/event_enum.rs @@ -358,8 +358,6 @@ fn expand_content_enum( let state_event_content_impl = (kind == EventKind::State).then(|| { quote! { type StateKey = String; - // FIXME: Not actually used - type Unsigned = #ruma_common::events::StateUnsigned; } });