events: Update state key types for all state events
… and make it mandatory to specify for state events.
This commit is contained in:
		
							parent
							
								
									d8b7886382
								
							
						
					
					
						commit
						ae7461622c
					
				| @ -28,7 +28,7 @@ | ||||
| //! use serde::{Deserialize, Serialize};
 | ||||
| //!
 | ||||
| //! #[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
 | ||||
| //! #[ruma_event(type = "org.example.event", kind = State)]
 | ||||
| //! #[ruma_event(type = "org.example.event", kind = State, state_key_type = String)]
 | ||||
| //! pub struct ExampleContent {
 | ||||
| //!     field: String,
 | ||||
| //! }
 | ||||
| @ -113,6 +113,7 @@ pub mod _custom; | ||||
| mod content; | ||||
| mod enums; | ||||
| mod kinds; | ||||
| mod state_key; | ||||
| mod unsigned; | ||||
| 
 | ||||
| /// Re-export of all the derives needed to create your own event types.
 | ||||
| @ -170,6 +171,7 @@ pub use self::{ | ||||
|     content::*, | ||||
|     enums::*, | ||||
|     kinds::*, | ||||
|     state_key::EmptyStateKey, | ||||
|     unsigned::{MessageLikeUnsigned, RedactedUnsigned, StateUnsigned}, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -12,7 +12,7 @@ use super::PolicyRuleEventContent; | ||||
| /// This event type is used to apply rules to room entities.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[allow(clippy::exhaustive_structs)] | ||||
| #[ruma_event(type = "m.policy.rule.room", kind = State)] | ||||
| #[ruma_event(type = "m.policy.rule.room", kind = State, state_key_type = String)] | ||||
| pub struct PolicyRuleRoomEventContent(pub PolicyRuleEventContent); | ||||
| 
 | ||||
| #[cfg(test)] | ||||
|  | ||||
| @ -12,5 +12,5 @@ use super::PolicyRuleEventContent; | ||||
| /// This event type is used to apply rules to server entities.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[allow(clippy::exhaustive_structs)] | ||||
| #[ruma_event(type = "m.policy.rule.server", kind = State)] | ||||
| #[ruma_event(type = "m.policy.rule.server", kind = State, state_key_type = String)] | ||||
| pub struct PolicyRuleServerEventContent(pub PolicyRuleEventContent); | ||||
|  | ||||
| @ -12,5 +12,5 @@ use super::PolicyRuleEventContent; | ||||
| /// This event type is used to apply rules to user entities.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[allow(clippy::exhaustive_structs)] | ||||
| #[ruma_event(type = "m.policy.rule.user", kind = State)] | ||||
| #[ruma_event(type = "m.policy.rule.user", kind = State, state_key_type = String)] | ||||
| pub struct PolicyRuleUserEventContent(pub PolicyRuleEventContent); | ||||
|  | ||||
| @ -9,7 +9,7 @@ use crate::{ | ||||
|         EventContent, HasDeserializeFields, RedactContent, RedactedEventContent, StateEventContent, | ||||
|         StateEventType, | ||||
|     }, | ||||
|     OwnedRoomAliasId, RoomVersionId, | ||||
|     OwnedRoomAliasId, OwnedServerName, RoomVersionId, | ||||
| }; | ||||
| 
 | ||||
| /// The content of an `m.room.aliases` event.
 | ||||
| @ -17,7 +17,7 @@ use crate::{ | ||||
| /// Informs the room about what room aliases it has been given.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.aliases", kind = State, custom_redacted)] | ||||
| #[ruma_event(type = "m.room.aliases", kind = State, state_key_type = OwnedServerName, custom_redacted)] | ||||
| pub struct RoomAliasesEventContent { | ||||
|     /// A list of room aliases.
 | ||||
|     pub aliases: Vec<OwnedRoomAliasId>, | ||||
| @ -96,7 +96,7 @@ impl EventContent for RedactedRoomAliasesEventContent { | ||||
| } | ||||
| 
 | ||||
| impl StateEventContent for RedactedRoomAliasesEventContent { | ||||
|     type StateKey = String; // Box<ServerName>
 | ||||
|     type StateKey = OwnedServerName; | ||||
| } | ||||
| 
 | ||||
| // Since this redacted event has fields we leave the default `empty` method
 | ||||
|  | ||||
| @ -7,7 +7,7 @@ use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use super::ThumbnailInfo; | ||||
| use crate::MxcUri; | ||||
| use crate::{events::EmptyStateKey, MxcUri}; | ||||
| 
 | ||||
| /// The content of an `m.room.avatar` event.
 | ||||
| ///
 | ||||
| @ -16,7 +16,7 @@ use crate::MxcUri; | ||||
| /// This can be displayed alongside the room information.
 | ||||
| #[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.avatar", kind = State)] | ||||
| #[ruma_event(type = "m.room.avatar", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomAvatarEventContent { | ||||
|     /// Information about the avatar image.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|  | ||||
| @ -5,14 +5,14 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::OwnedRoomAliasId; | ||||
| use crate::{events::EmptyStateKey, OwnedRoomAliasId}; | ||||
| 
 | ||||
| /// The content of an `m.room.canonical_alias` event.
 | ||||
| ///
 | ||||
| /// Informs the room as to which alias is the canonical one.
 | ||||
| #[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.canonical_alias", kind = State)] | ||||
| #[ruma_event(type = "m.room.canonical_alias", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomCanonicalAliasEventContent { | ||||
|     /// The canonical alias.
 | ||||
|     ///
 | ||||
| @ -39,12 +39,15 @@ impl RoomCanonicalAliasEventContent { | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::{event_id, room_alias_id, room_id, user_id, MilliSecondsSinceUnixEpoch}; | ||||
|     use js_int::uint; | ||||
|     use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::RoomCanonicalAliasEventContent; | ||||
|     use crate::events::{OriginalStateEvent, StateUnsigned}; | ||||
|     use crate::{ | ||||
|         event_id, | ||||
|         events::{EmptyStateKey, OriginalStateEvent, StateUnsigned}, | ||||
|         room_alias_id, room_id, user_id, MilliSecondsSinceUnixEpoch, | ||||
|     }; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn serialization_with_optional_fields_as_none() { | ||||
| @ -57,7 +60,7 @@ mod tests { | ||||
|             origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)), | ||||
|             room_id: room_id!("!dummy:example.com").to_owned(), | ||||
|             sender: user_id!("@carl:example.com").to_owned(), | ||||
|             state_key: "".into(), | ||||
|             state_key: EmptyStateKey, | ||||
|             unsigned: StateUnsigned::default(), | ||||
|         }; | ||||
| 
 | ||||
|  | ||||
| @ -5,7 +5,9 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::{room::RoomType, OwnedEventId, OwnedRoomId, OwnedUserId, RoomVersionId}; | ||||
| use crate::{ | ||||
|     events::EmptyStateKey, room::RoomType, OwnedEventId, OwnedRoomId, OwnedUserId, RoomVersionId, | ||||
| }; | ||||
| 
 | ||||
| /// The content of an `m.room.create` event.
 | ||||
| ///
 | ||||
| @ -14,7 +16,7 @@ use crate::{room::RoomType, OwnedEventId, OwnedRoomId, OwnedUserId, RoomVersionI | ||||
| /// It acts as the root of all other events.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.create", kind = State)] | ||||
| #[ruma_event(type = "m.room.create", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomCreateEventContent { | ||||
|     /// The `user_id` of the room creator.
 | ||||
|     ///
 | ||||
| @ -85,11 +87,11 @@ fn default_room_version_id() -> RoomVersionId { | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::{user_id, RoomVersionId}; | ||||
|     use matches::assert_matches; | ||||
|     use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::{RoomCreateEventContent, RoomType}; | ||||
|     use crate::{user_id, RoomVersionId}; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn serialization() { | ||||
|  | ||||
| @ -6,14 +6,14 @@ use js_int::UInt; | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::events::EventEncryptionAlgorithm; | ||||
| use crate::events::{EmptyStateKey, EventEncryptionAlgorithm}; | ||||
| 
 | ||||
| /// The content of an `m.room.encryption` event.
 | ||||
| ///
 | ||||
| /// Defines how messages sent in this room should be encrypted.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.encryption", kind = State)] | ||||
| #[ruma_event(type = "m.room.encryption", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomEncryptionEventContent { | ||||
|     /// The encryption algorithm to be used to encrypt messages sent in this room.
 | ||||
|     ///
 | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::{serde::StringEnum, PrivOwnedStr}; | ||||
| use crate::{events::EmptyStateKey, serde::StringEnum, PrivOwnedStr}; | ||||
| 
 | ||||
| /// The content of an `m.room.guest_access` event.
 | ||||
| ///
 | ||||
| @ -15,7 +15,7 @@ use crate::{serde::StringEnum, PrivOwnedStr}; | ||||
| /// servers should act as if it is present and has the value `GuestAccess::Forbidden`.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.guest_access", kind = State)] | ||||
| #[ruma_event(type = "m.room.guest_access", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomGuestAccessEventContent { | ||||
|     /// A policy for guest user access to a room.
 | ||||
|     pub guest_access: GuestAccess, | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::{serde::StringEnum, PrivOwnedStr}; | ||||
| use crate::{events::EmptyStateKey, serde::StringEnum, PrivOwnedStr}; | ||||
| 
 | ||||
| /// The content of an `m.room.history_visibility` event.
 | ||||
| ///
 | ||||
| @ -13,7 +13,7 @@ use crate::{serde::StringEnum, PrivOwnedStr}; | ||||
| /// before they joined.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.history_visibility", kind = State)] | ||||
| #[ruma_event(type = "m.room.history_visibility", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomHistoryVisibilityEventContent { | ||||
|     /// Who can see the room history.
 | ||||
|     #[ruma_event(skip_redaction)] | ||||
|  | ||||
| @ -11,14 +11,14 @@ use serde::{ | ||||
| }; | ||||
| use serde_json::{value::RawValue as RawJsonValue, Value as JsonValue}; | ||||
| 
 | ||||
| use crate::{serde::from_raw_json_value, OwnedRoomId, PrivOwnedStr}; | ||||
| use crate::{events::EmptyStateKey, serde::from_raw_json_value, OwnedRoomId, PrivOwnedStr}; | ||||
| 
 | ||||
| /// The content of an `m.room.join_rules` event.
 | ||||
| ///
 | ||||
| /// Describes how users are allowed to join the room.
 | ||||
| #[derive(Clone, Debug, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.join_rules", kind = State)] | ||||
| #[ruma_event(type = "m.room.join_rules", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomJoinRulesEventContent { | ||||
|     /// The type of rules used for users wishing to join this room.
 | ||||
|     #[ruma_event(skip_redaction)] | ||||
| @ -238,10 +238,10 @@ impl<'de> Deserialize<'de> for AllowRule { | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::room_id; | ||||
|     use matches::assert_matches; | ||||
| 
 | ||||
|     use super::{AllowRule, JoinRule, OriginalSyncRoomJoinRulesEvent, RoomJoinRulesEventContent}; | ||||
|     use crate::room_id; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn deserialize() { | ||||
|  | ||||
| @ -40,7 +40,7 @@ use crate::{ | ||||
| /// must be assumed as leave.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.member", kind = State, custom_redacted)] | ||||
| #[ruma_event(type = "m.room.member", kind = State, state_key_type = OwnedUserId, custom_redacted)] | ||||
| pub struct RoomMemberEventContent { | ||||
|     /// The avatar URL for this user, if any.
 | ||||
|     ///
 | ||||
| @ -176,7 +176,7 @@ impl EventContent for RedactedRoomMemberEventContent { | ||||
| } | ||||
| 
 | ||||
| impl StateEventContent for RedactedRoomMemberEventContent { | ||||
|     type StateKey = String; // Box<UserId>
 | ||||
|     type StateKey = OwnedUserId; | ||||
| } | ||||
| 
 | ||||
| // Since this redacted event has fields we leave the default `empty` method
 | ||||
| @ -329,7 +329,7 @@ fn membership_change( | ||||
|     content: &RoomMemberEventContent, | ||||
|     prev_content: Option<&RoomMemberEventContent>, | ||||
|     sender: &UserId, | ||||
|     state_key: &str, | ||||
|     state_key: &UserId, | ||||
| ) -> MembershipChange { | ||||
|     use MembershipChange as Ch; | ||||
|     use MembershipState as St; | ||||
| @ -425,14 +425,16 @@ impl StrippedStateEvent<RoomMemberEventContent> { | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::{server_name, server_signing_key_id, MilliSecondsSinceUnixEpoch}; | ||||
|     use js_int::uint; | ||||
|     use maplit::btreemap; | ||||
|     use matches::assert_matches; | ||||
|     use serde_json::{from_value as from_json_value, json}; | ||||
| 
 | ||||
|     use super::{MembershipState, RoomMemberEventContent, SignedContent, ThirdPartyInvite}; | ||||
|     use crate::events::{OriginalStateEvent, StateUnsigned}; | ||||
|     use crate::{ | ||||
|         events::{OriginalStateEvent, StateUnsigned}, | ||||
|         server_name, server_signing_key_id, MilliSecondsSinceUnixEpoch, | ||||
|     }; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn serde_with_no_prev_content() { | ||||
| @ -445,7 +447,7 @@ mod tests { | ||||
|             "origin_server_ts": 1, | ||||
|             "room_id": "!n8f893n9:example.com", | ||||
|             "sender": "@carl:example.com", | ||||
|             "state_key": "example.com" | ||||
|             "state_key": "@carl:example.com" | ||||
|         }); | ||||
| 
 | ||||
|         assert_matches!( | ||||
| @ -469,7 +471,7 @@ mod tests { | ||||
|                 && origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1)) | ||||
|                 && room_id == "!n8f893n9:example.com" | ||||
|                 && sender == "@carl:example.com" | ||||
|                 && state_key == "example.com" | ||||
|                 && state_key == "@carl:example.com" | ||||
|                 && unsigned.is_empty() | ||||
|         ); | ||||
|     } | ||||
| @ -485,7 +487,7 @@ mod tests { | ||||
|             "origin_server_ts": 1, | ||||
|             "room_id": "!n8f893n9:example.com", | ||||
|             "sender": "@carl:example.com", | ||||
|             "state_key": "example.com", | ||||
|             "state_key": "@carl:example.com", | ||||
|             "unsigned": { | ||||
|                 "prev_content": { | ||||
|                     "membership": "join" | ||||
| @ -511,7 +513,7 @@ mod tests { | ||||
|         assert_eq!(ev.origin_server_ts, MilliSecondsSinceUnixEpoch(uint!(1))); | ||||
|         assert_eq!(ev.room_id, "!n8f893n9:example.com"); | ||||
|         assert_eq!(ev.sender, "@carl:example.com"); | ||||
|         assert_eq!(ev.state_key, "example.com"); | ||||
|         assert_eq!(ev.state_key, "@carl:example.com"); | ||||
| 
 | ||||
|         assert_matches!( | ||||
|             ev.unsigned, | ||||
| @ -691,7 +693,7 @@ mod tests { | ||||
|             "origin_server_ts": 1, | ||||
|             "room_id": "!n8f893n9:example.com", | ||||
|             "sender": "@carl:example.com", | ||||
|             "state_key": "example.com" | ||||
|             "state_key": "@carl:example.com" | ||||
|         }); | ||||
| 
 | ||||
|         assert_matches!( | ||||
| @ -717,7 +719,7 @@ mod tests { | ||||
|                 && room_id == "!n8f893n9:example.com" | ||||
|                 && sender == "@carl:example.com" | ||||
|                 && authed == "@notcarl:example.com" | ||||
|                 && state_key == "example.com" | ||||
|                 && state_key == "@carl:example.com" | ||||
|                 && unsigned.is_empty() | ||||
|         ); | ||||
|     } | ||||
|  | ||||
| @ -5,14 +5,14 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::RoomName; | ||||
| use crate::{events::EmptyStateKey, RoomName}; | ||||
| 
 | ||||
| /// The content of an `m.room.name` event.
 | ||||
| ///
 | ||||
| /// The room name is a human-friendly string designed to be displayed to the end-user.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[ruma_event(type = "m.room.name", kind = State)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.name", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomNameEventContent { | ||||
|     /// The name of the room.
 | ||||
|     #[serde(default, deserialize_with = "crate::serde::empty_string_as_none")] | ||||
| @ -30,13 +30,18 @@ impl RoomNameEventContent { | ||||
| mod tests { | ||||
|     use std::convert::TryInto; | ||||
| 
 | ||||
|     use crate::{event_id, room_id, serde::Raw, user_id, MilliSecondsSinceUnixEpoch}; | ||||
|     use js_int::{int, uint}; | ||||
|     use matches::assert_matches; | ||||
|     use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::RoomNameEventContent; | ||||
|     use crate::events::{OriginalStateEvent, StateUnsigned}; | ||||
|     use crate::{ | ||||
|         event_id, | ||||
|         events::{EmptyStateKey, OriginalStateEvent, StateUnsigned}, | ||||
|         room_id, | ||||
|         serde::Raw, | ||||
|         user_id, MilliSecondsSinceUnixEpoch, | ||||
|     }; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn serialization_with_optional_fields_as_none() { | ||||
| @ -46,7 +51,7 @@ mod tests { | ||||
|             origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)), | ||||
|             room_id: room_id!("!n8f893n9:example.com").to_owned(), | ||||
|             sender: user_id!("@carl:example.com").to_owned(), | ||||
|             state_key: "".into(), | ||||
|             state_key: EmptyStateKey, | ||||
|             unsigned: StateUnsigned::default(), | ||||
|         }; | ||||
| 
 | ||||
| @ -74,7 +79,7 @@ mod tests { | ||||
|             origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)), | ||||
|             room_id: room_id!("!n8f893n9:example.com").to_owned(), | ||||
|             sender: user_id!("@carl:example.com").to_owned(), | ||||
|             state_key: "".into(), | ||||
|             state_key: EmptyStateKey, | ||||
|             unsigned: StateUnsigned { | ||||
|                 age: Some(int!(100)), | ||||
|                 prev_content: Some(RoomNameEventContent { name: "The old name".try_into().ok() }), | ||||
|  | ||||
| @ -5,14 +5,14 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::OwnedEventId; | ||||
| use crate::{events::EmptyStateKey, OwnedEventId}; | ||||
| 
 | ||||
| /// The content of an `m.room.pinned_events` event.
 | ||||
| ///
 | ||||
| /// Used to "pin" particular events in a room for other participants to review later.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.pinned_events", kind = State)] | ||||
| #[ruma_event(type = "m.room.pinned_events", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomPinnedEventsEventContent { | ||||
|     /// An ordered list of event IDs to pin.
 | ||||
|     pub pinned: Vec<OwnedEventId>, | ||||
| @ -29,10 +29,11 @@ impl RoomPinnedEventsEventContent { | ||||
| mod tests { | ||||
|     use std::convert::TryInto; | ||||
| 
 | ||||
|     use crate::{server_name, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId}; | ||||
| 
 | ||||
|     use super::RoomPinnedEventsEventContent; | ||||
|     use crate::events::{OriginalStateEvent, StateUnsigned}; | ||||
|     use crate::{ | ||||
|         events::{EmptyStateKey, OriginalStateEvent, StateUnsigned}, | ||||
|         server_name, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId, | ||||
|     }; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn serialization_deserialization() { | ||||
| @ -49,7 +50,7 @@ mod tests { | ||||
|             origin_server_ts: MilliSecondsSinceUnixEpoch(1_432_804_485_886_u64.try_into().unwrap()), | ||||
|             room_id: RoomId::new(server_name), | ||||
|             sender: UserId::new(server_name), | ||||
|             state_key: "".into(), | ||||
|             state_key: EmptyStateKey, | ||||
|             unsigned: StateUnsigned::default(), | ||||
|         }; | ||||
| 
 | ||||
|  | ||||
| @ -9,7 +9,7 @@ use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::{ | ||||
|     events::RoomEventType, | ||||
|     events::{EmptyStateKey, RoomEventType}, | ||||
|     power_levels::{default_power_level, NotificationPowerLevels}, | ||||
|     OwnedUserId, UserId, | ||||
| }; | ||||
| @ -19,7 +19,7 @@ use crate::{ | ||||
| /// Defines the power levels (privileges) of users in the room.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.power_levels", kind = State)] | ||||
| #[ruma_event(type = "m.room.power_levels", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomPowerLevelsEventContent { | ||||
|     /// The level required to ban a user.
 | ||||
|     ///
 | ||||
| @ -288,14 +288,17 @@ impl From<RedactedRoomPowerLevelsEventContent> for RoomPowerLevels { | ||||
| mod tests { | ||||
|     use std::collections::BTreeMap; | ||||
| 
 | ||||
|     use crate::{event_id, room_id, user_id, MilliSecondsSinceUnixEpoch}; | ||||
|     use assign::assign; | ||||
|     use js_int::{int, uint}; | ||||
|     use maplit::btreemap; | ||||
|     use serde_json::{json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::{default_power_level, NotificationPowerLevels, RoomPowerLevelsEventContent}; | ||||
|     use crate::events::{OriginalStateEvent, StateUnsigned}; | ||||
|     use crate::{ | ||||
|         event_id, | ||||
|         events::{EmptyStateKey, OriginalStateEvent, StateUnsigned}, | ||||
|         room_id, user_id, MilliSecondsSinceUnixEpoch, | ||||
|     }; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn serialization_with_optional_fields_as_none() { | ||||
| @ -319,7 +322,7 @@ mod tests { | ||||
|             room_id: room_id!("!n8f893n9:example.com").to_owned(), | ||||
|             unsigned: StateUnsigned::default(), | ||||
|             sender: user_id!("@carl:example.com").to_owned(), | ||||
|             state_key: "".into(), | ||||
|             state_key: EmptyStateKey, | ||||
|         }; | ||||
| 
 | ||||
|         let actual = to_json_value(&power_levels_event).unwrap(); | ||||
| @ -382,7 +385,7 @@ mod tests { | ||||
|                 ..StateUnsigned::default() | ||||
|             }, | ||||
|             sender: user.to_owned(), | ||||
|             state_key: "".into(), | ||||
|             state_key: EmptyStateKey, | ||||
|         }; | ||||
| 
 | ||||
|         let actual = to_json_value(&power_levels_event).unwrap(); | ||||
|  | ||||
| @ -6,14 +6,14 @@ use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use wildmatch::WildMatch; | ||||
| 
 | ||||
| use crate::ServerName; | ||||
| use crate::{events::EmptyStateKey, ServerName}; | ||||
| 
 | ||||
| /// The content of an `m.room.server_acl` event.
 | ||||
| ///
 | ||||
| /// An event to indicate which servers are permitted to participate in the room.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.server_acl", kind = State)] | ||||
| #[ruma_event(type = "m.room.server_acl", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomServerAclEventContent { | ||||
|     /// Whether to allow server names that are IP address literals.
 | ||||
|     ///
 | ||||
| @ -64,11 +64,10 @@ impl RoomServerAclEventContent { | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::server_name; | ||||
|     use serde_json::{from_value as from_json_value, json}; | ||||
| 
 | ||||
|     use super::RoomServerAclEventContent; | ||||
|     use crate::events::OriginalStateEvent; | ||||
|     use crate::{events::OriginalStateEvent, server_name}; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn default_values() { | ||||
|  | ||||
| @ -16,7 +16,7 @@ use crate::serde::Base64; | ||||
| /// Any user who can present that signature may use this invitation to join the target room.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.third_party_invite", kind = State)] | ||||
| #[ruma_event(type = "m.room.third_party_invite", kind = State, state_key_type = String)] | ||||
| pub struct RoomThirdPartyInviteEventContent { | ||||
|     /// A user-readable string which represents the user who has been invited.
 | ||||
|     ///
 | ||||
|  | ||||
| @ -5,14 +5,14 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::OwnedRoomId; | ||||
| use crate::{events::EmptyStateKey, OwnedRoomId}; | ||||
| 
 | ||||
| /// The content of an `m.room.tombstone` event.
 | ||||
| ///
 | ||||
| /// A state event signifying that a room has been upgraded to a different room version, and that
 | ||||
| /// clients should go there.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[ruma_event(type = "m.room.tombstone", kind = State)] | ||||
| #[ruma_event(type = "m.room.tombstone", kind = State, state_key_type = EmptyStateKey)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| pub struct RoomTombstoneEventContent { | ||||
|     /// A server-defined message.
 | ||||
|  | ||||
| @ -5,12 +5,14 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::events::EmptyStateKey; | ||||
| 
 | ||||
| /// The content of an `m.room.topic` event.
 | ||||
| ///
 | ||||
| /// A topic is a short message detailing what is currently being discussed in the room.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.room.topic", kind = State)] | ||||
| #[ruma_event(type = "m.room.topic", kind = State, state_key_type = EmptyStateKey)] | ||||
| pub struct RoomTopicEventContent { | ||||
|     /// The topic text.
 | ||||
|     pub topic: String, | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
| use ruma_macros::{Event, EventContent}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::{MilliSecondsSinceUnixEpoch, OwnedServerName, OwnedUserId}; | ||||
| use crate::{MilliSecondsSinceUnixEpoch, OwnedRoomId, OwnedServerName, OwnedUserId}; | ||||
| 
 | ||||
| /// The content of an `m.space.child` event.
 | ||||
| ///
 | ||||
| @ -16,7 +16,7 @@ use crate::{MilliSecondsSinceUnixEpoch, OwnedServerName, OwnedUserId}; | ||||
| /// which gives a list of candidate servers that can be used to join the room.
 | ||||
| #[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.space.child", kind = State)] | ||||
| #[ruma_event(type = "m.space.child", kind = State, state_key_type = OwnedRoomId)] | ||||
| pub struct SpaceChildEventContent { | ||||
|     /// List of candidate servers that can be used to join the room.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
| @ -71,12 +71,12 @@ pub struct HierarchySpaceChildEvent { | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::{server_name, user_id, MilliSecondsSinceUnixEpoch}; | ||||
|     use js_int::uint; | ||||
|     use matches::assert_matches; | ||||
|     use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::{HierarchySpaceChildEvent, SpaceChildEventContent}; | ||||
|     use crate::{server_name, user_id, MilliSecondsSinceUnixEpoch}; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn space_child_serialization() { | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
| use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::OwnedServerName; | ||||
| use crate::{OwnedRoomId, OwnedServerName}; | ||||
| 
 | ||||
| /// The content of an `m.space.parent` event.
 | ||||
| ///
 | ||||
| @ -16,7 +16,7 @@ use crate::OwnedServerName; | ||||
| /// parent.
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] | ||||
| #[ruma_event(type = "m.space.parent", kind = State)] | ||||
| #[ruma_event(type = "m.space.parent", kind = State, state_key_type = OwnedRoomId)] | ||||
| pub struct SpaceParentEventContent { | ||||
|     /// List of candidate servers that can be used to join the room.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
| @ -41,10 +41,10 @@ impl SpaceParentEventContent { | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::server_name; | ||||
|     use serde_json::{json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::SpaceParentEventContent; | ||||
|     use crate::server_name; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn space_parent_serialization() { | ||||
|  | ||||
							
								
								
									
										38
									
								
								crates/ruma-common/src/events/state_key.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								crates/ruma-common/src/events/state_key.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| use serde::{ | ||||
|     de::{self, Deserialize, Deserializer, Unexpected}, | ||||
|     Serialize, Serializer, | ||||
| }; | ||||
| 
 | ||||
| /// A type that can be used as the `state_key` for event types where that field is always empty.
 | ||||
| #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] | ||||
| #[allow(clippy::exhaustive_structs)] | ||||
| pub struct EmptyStateKey; | ||||
| 
 | ||||
| impl AsRef<str> for EmptyStateKey { | ||||
|     fn as_ref(&self) -> &str { | ||||
|         "" | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'de> Deserialize<'de> for EmptyStateKey { | ||||
|     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> | ||||
|     where | ||||
|         D: Deserializer<'de>, | ||||
|     { | ||||
|         let s = crate::serde::deserialize_cow_str(deserializer)?; | ||||
|         if s.is_empty() { | ||||
|             Ok(EmptyStateKey) | ||||
|         } else { | ||||
|             Err(de::Error::invalid_value(Unexpected::Str(&s), &"an empty string")) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Serialize for EmptyStateKey { | ||||
|     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> | ||||
|     where | ||||
|         S: Serializer, | ||||
|     { | ||||
|         serializer.serialize_str("") | ||||
|     } | ||||
| } | ||||
| @ -70,7 +70,7 @@ fn aliases_event() -> JsonValue { | ||||
|         "event_id": "$152037280074GZeOm:localhost", | ||||
|         "origin_server_ts": 1, | ||||
|         "sender": "@example:localhost", | ||||
|         "state_key": "", | ||||
|         "state_key": "room.com", | ||||
|         "room_id": "!room:room.com", | ||||
|         "type": "m.room.aliases", | ||||
|         "unsigned": { | ||||
| @ -87,7 +87,7 @@ fn aliases_event_sync() -> JsonValue { | ||||
|         "event_id": "$152037280074GZeOm:localhost", | ||||
|         "origin_server_ts": 1, | ||||
|         "sender": "@example:localhost", | ||||
|         "state_key": "", | ||||
|         "state_key": "example.com", | ||||
|         "type": "m.room.aliases", | ||||
|         "unsigned": { | ||||
|             "age": 1 | ||||
| @ -172,21 +172,14 @@ fn message_event_sync_deserialization() { | ||||
| fn aliases_event_sync_deserialization() { | ||||
|     let json_data = aliases_event_sync(); | ||||
| 
 | ||||
|     assert_matches!( | ||||
|         from_json_value::<AnySyncRoomEvent>(json_data), | ||||
|         Ok(AnySyncRoomEvent::State( | ||||
|             AnySyncStateEvent::RoomAliases(SyncStateEvent::Original( | ||||
|                 OriginalSyncStateEvent { | ||||
|                     content: RoomAliasesEventContent { | ||||
|                         aliases, | ||||
|                         .. | ||||
|                     }, | ||||
|                     .. | ||||
|                 }, | ||||
|             )) | ||||
|         )) | ||||
|         if aliases == vec![ room_alias_id!("#somewhere:localhost") ] | ||||
|     ); | ||||
|     let ev = match from_json_value::<AnySyncRoomEvent>(json_data) { | ||||
|         Ok(AnySyncRoomEvent::State(AnySyncStateEvent::RoomAliases(SyncStateEvent::Original( | ||||
|             ev, | ||||
|         )))) => ev, | ||||
|         res => panic!("unexpected result: {:?}", res), | ||||
|     }; | ||||
| 
 | ||||
|     assert_eq!(ev.content.aliases, vec![room_alias_id!("#somewhere:localhost")]); | ||||
| } | ||||
| 
 | ||||
| #[test] | ||||
| @ -253,7 +246,7 @@ fn alias_room_event_deserialization() { | ||||
|                 .. | ||||
|             })) | ||||
|         )) | ||||
|         if aliases == vec![ room_alias_id!("#somewhere:localhost") ] | ||||
|         if aliases == vec![room_alias_id!("#somewhere:localhost")] | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| @ -295,7 +288,7 @@ fn alias_event_deserialization() { | ||||
|                 .. | ||||
|             })) | ||||
|         )) | ||||
|         if aliases == vec![ room_alias_id!("#somewhere:localhost") ] | ||||
|         if aliases == vec![room_alias_id!("#somewhere:localhost")] | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| @ -306,7 +299,7 @@ fn alias_event_field_access() { | ||||
|     assert_matches!( | ||||
|         from_json_value::<AnyRoomEvent>(json_data.clone()), | ||||
|         Ok(AnyRoomEvent::State(state_event)) | ||||
|         if state_event.state_key() == "" | ||||
|         if state_event.state_key() == "room.com" | ||||
|             && state_event.room_id() == room_id!("!room:room.com") | ||||
|             && state_event.event_id() == event_id!("$152037280074GZeOm:localhost") | ||||
|             && state_event.sender() == user_id!("@example:localhost") | ||||
|  | ||||
| @ -15,8 +15,7 @@ fn deserialize_initial_state_event() { | ||||
|             "content": { "name": "foo" } | ||||
|         })) | ||||
|         .unwrap(), | ||||
|         AnyInitialStateEvent::RoomName(InitialStateEvent { content, state_key}) | ||||
|         AnyInitialStateEvent::RoomName(InitialStateEvent { content, .. }) | ||||
|         if content.name == Some(Box::<RoomName>::try_from("foo").unwrap()) | ||||
|             && state_key.is_empty() | ||||
|     ); | ||||
| } | ||||
|  | ||||
| @ -16,7 +16,7 @@ use ruma_common::{ | ||||
|         RedactedMessageLikeEvent, RedactedSyncMessageLikeEvent, RedactedSyncStateEvent, | ||||
|         RedactedUnsigned, SyncMessageLikeEvent, SyncStateEvent, | ||||
|     }, | ||||
|     room_id, user_id, MilliSecondsSinceUnixEpoch, RoomVersionId, | ||||
|     room_id, server_name, user_id, MilliSecondsSinceUnixEpoch, RoomVersionId, | ||||
| }; | ||||
| use serde_json::{ | ||||
|     from_value as from_json_value, json, to_value as to_json_value, | ||||
| @ -64,7 +64,7 @@ fn redacted_aliases_event_serialize_no_content() { | ||||
|     let redacted = RedactedSyncStateEvent { | ||||
|         content: RedactedRoomAliasesEventContent::default(), | ||||
|         event_id: event_id!("$h29iv0s8:example.com").to_owned(), | ||||
|         state_key: "".into(), | ||||
|         state_key: server_name!("example.com").to_owned(), | ||||
|         origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)), | ||||
|         sender: user_id!("@carl:example.com").to_owned(), | ||||
|         unsigned: RedactedUnsigned::default(), | ||||
| @ -72,7 +72,7 @@ fn redacted_aliases_event_serialize_no_content() { | ||||
| 
 | ||||
|     let expected = json!({ | ||||
|       "event_id": "$h29iv0s8:example.com", | ||||
|       "state_key": "", | ||||
|       "state_key": "example.com", | ||||
|       "origin_server_ts": 1, | ||||
|       "sender": "@carl:example.com", | ||||
|       "type": "m.room.aliases", | ||||
| @ -87,7 +87,7 @@ fn redacted_aliases_event_serialize_with_content() { | ||||
|     let redacted = RedactedSyncStateEvent { | ||||
|         content: RedactedRoomAliasesEventContent::new_v1(vec![]), | ||||
|         event_id: event_id!("$h29iv0s8:example.com").to_owned(), | ||||
|         state_key: "".to_owned(), | ||||
|         state_key: server_name!("example.com").to_owned(), | ||||
|         origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)), | ||||
|         sender: user_id!("@carl:example.com").to_owned(), | ||||
|         unsigned: RedactedUnsigned::default(), | ||||
| @ -98,7 +98,7 @@ fn redacted_aliases_event_serialize_with_content() { | ||||
|           "aliases": [] | ||||
|       }, | ||||
|       "event_id": "$h29iv0s8:example.com", | ||||
|       "state_key": "", | ||||
|       "state_key": "example.com", | ||||
|       "origin_server_ts": 1, | ||||
|       "sender": "@carl:example.com", | ||||
|       "type": "m.room.aliases", | ||||
| @ -206,7 +206,7 @@ fn redacted_state_event_deserialize() { | ||||
|       "event_id": "$h29iv0s8:example.com", | ||||
|       "origin_server_ts": 1, | ||||
|       "sender": "@carl:example.com", | ||||
|       "state_key": "hello there", | ||||
|       "state_key": "", | ||||
|       "unsigned": unsigned(), | ||||
|       "type": "m.room.create", | ||||
|     }); | ||||
| @ -220,13 +220,11 @@ fn redacted_state_event_deserialize() { | ||||
|                     creator, .. | ||||
|                 }, | ||||
|                 event_id, | ||||
|                 state_key, | ||||
|                 unsigned, | ||||
|                 .. | ||||
|             }), | ||||
|         )) if event_id == event_id!("$h29iv0s8:example.com") | ||||
|             && unsigned.redacted_because.is_some() | ||||
|             && state_key == "hello there" | ||||
|             && creator == user_id!("@carl:example.com") | ||||
|     ) | ||||
| } | ||||
|  | ||||
| @ -14,7 +14,7 @@ use ruma_common::{ | ||||
|     }, | ||||
|     mxc_uri, room_alias_id, room_id, | ||||
|     serde::Raw, | ||||
|     user_id, MilliSecondsSinceUnixEpoch, | ||||
|     server_name, user_id, MilliSecondsSinceUnixEpoch, | ||||
| }; | ||||
| use serde_json::{ | ||||
|     from_value as from_json_value, json, to_value as to_json_value, Value as JsonValue, | ||||
| @ -29,7 +29,7 @@ fn aliases_event_with_prev_content() -> JsonValue { | ||||
|         "origin_server_ts": 1, | ||||
|         "room_id": "!roomid:room.com", | ||||
|         "sender": "@carl:example.com", | ||||
|         "state_key": "", | ||||
|         "state_key": "room.com", | ||||
|         "type": "m.room.aliases", | ||||
|         "unsigned": { | ||||
|             "prev_content": { | ||||
| @ -49,7 +49,7 @@ fn serialize_aliases_with_prev_content() { | ||||
|         origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)), | ||||
|         room_id: room_id!("!roomid:room.com").to_owned(), | ||||
|         sender: user_id!("@carl:example.com").to_owned(), | ||||
|         state_key: "".into(), | ||||
|         state_key: server_name!("room.com").to_owned(), | ||||
|         unsigned: assign!(StateUnsigned::default(), { | ||||
|             prev_content: Some(RoomAliasesEventContent::new(vec![room_alias_id!( | ||||
|                 "#inner:localhost" | ||||
| @ -74,7 +74,7 @@ fn serialize_aliases_without_prev_content() { | ||||
|         origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)), | ||||
|         room_id: room_id!("!roomid:room.com").to_owned(), | ||||
|         sender: user_id!("@carl:example.com").to_owned(), | ||||
|         state_key: "".into(), | ||||
|         state_key: server_name!("example.com").to_owned(), | ||||
|         unsigned: StateUnsigned::default(), | ||||
|     }; | ||||
| 
 | ||||
| @ -87,7 +87,7 @@ fn serialize_aliases_without_prev_content() { | ||||
|         "origin_server_ts": 1, | ||||
|         "room_id": "!roomid:room.com", | ||||
|         "sender": "@carl:example.com", | ||||
|         "state_key": "", | ||||
|         "state_key": "example.com", | ||||
|         "type": "m.room.aliases", | ||||
|     }); | ||||
| 
 | ||||
| @ -122,18 +122,17 @@ fn deserialize_aliases_with_prev_content() { | ||||
|             origin_server_ts, | ||||
|             room_id, | ||||
|             sender, | ||||
|             state_key, | ||||
|             unsigned: StateUnsigned { | ||||
|                 prev_content: Some(prev_content), | ||||
|                 .. | ||||
|             }, | ||||
|             .. | ||||
|         })) if content.aliases == vec![room_alias_id!("#somewhere:localhost")] | ||||
|             && event_id == event_id!("$h29iv0s8:example.com") | ||||
|             && origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1)) | ||||
|             && prev_content.aliases == vec![room_alias_id!("#inner:localhost")] | ||||
|             && room_id == room_id!("!roomid:room.com") | ||||
|             && sender == user_id!("@carl:example.com") | ||||
|             && state_key.is_empty() | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| @ -150,17 +149,16 @@ fn deserialize_aliases_sync_with_room_id() { | ||||
|             event_id, | ||||
|             origin_server_ts, | ||||
|             sender, | ||||
|             state_key, | ||||
|             unsigned: StateUnsigned { | ||||
|                 prev_content: Some(prev_content), | ||||
|                 .. | ||||
|             }, | ||||
|             .. | ||||
|         })) if content.aliases == vec![room_alias_id!("#somewhere:localhost")] | ||||
|             && event_id == event_id!("$h29iv0s8:example.com") | ||||
|             && origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1)) | ||||
|             && prev_content.aliases == vec![room_alias_id!("#inner:localhost")] | ||||
|             && sender == user_id!("@carl:example.com") | ||||
|             && state_key.is_empty() | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| @ -204,13 +202,12 @@ fn deserialize_avatar_without_prev_content() { | ||||
|             origin_server_ts, | ||||
|             room_id, | ||||
|             sender, | ||||
|             state_key, | ||||
|             unsigned, | ||||
|             .. | ||||
|         })) if event_id == event_id!("$h29iv0s8:example.com") | ||||
|             && origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1)) | ||||
|             && room_id == room_id!("!roomid:room.com") | ||||
|             && sender == user_id!("@carl:example.com") | ||||
|             && state_key.is_empty() | ||||
|             && matches!( | ||||
|                 info.as_ref(), | ||||
|                 ImageInfo { | ||||
| @ -288,24 +285,17 @@ fn deserialize_full_event_convert_to_sync() { | ||||
|     let json_data = aliases_event_with_prev_content(); | ||||
| 
 | ||||
|     let full_ev: AnyStateEvent = from_json_value(json_data).unwrap(); | ||||
|     let sync_ev = match AnySyncStateEvent::from(full_ev) { | ||||
|         AnySyncStateEvent::RoomAliases(SyncStateEvent::Original(ev)) => ev, | ||||
|         ev => panic!("unexpected variant for event {:?}", ev), | ||||
|     }; | ||||
| 
 | ||||
|     assert_matches!( | ||||
|         AnySyncStateEvent::from(full_ev), | ||||
|         AnySyncStateEvent::RoomAliases(SyncStateEvent::Original(OriginalSyncStateEvent { | ||||
|             content, | ||||
|             event_id, | ||||
|             origin_server_ts, | ||||
|             sender, | ||||
|             state_key, | ||||
|             unsigned: StateUnsigned { | ||||
|                 prev_content: Some(prev_content), | ||||
|                 .. | ||||
|             } | ||||
|         })) if content.aliases == vec![room_alias_id!("#somewhere:localhost")] | ||||
|             && event_id == "$h29iv0s8:example.com" | ||||
|             && origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1)) | ||||
|             && prev_content.aliases == vec![room_alias_id!("#inner:localhost")] | ||||
|             && sender == "@carl:example.com" | ||||
|             && state_key.is_empty() | ||||
|     assert_eq!(sync_ev.content.aliases, vec![room_alias_id!("#somewhere:localhost")]); | ||||
|     assert_eq!(sync_ev.event_id, "$h29iv0s8:example.com"); | ||||
|     assert_eq!(sync_ev.origin_server_ts, MilliSecondsSinceUnixEpoch(uint!(1))); | ||||
|     assert_eq!( | ||||
|         sync_ev.unsigned.prev_content.unwrap().aliases, | ||||
|         vec![room_alias_id!("#inner:localhost")] | ||||
|     ); | ||||
|     assert_eq!(sync_ev.sender, "@carl:example.com"); | ||||
| } | ||||
|  | ||||
| @ -4,7 +4,7 @@ use js_int::uint; | ||||
| use ruma_common::{ | ||||
|     events::{ | ||||
|         room::{join_rules::JoinRule, topic::RoomTopicEventContent}, | ||||
|         AnyStrippedStateEvent, StrippedStateEvent, | ||||
|         AnyStrippedStateEvent, EmptyStateKey, StrippedStateEvent, | ||||
|     }, | ||||
|     mxc_uri, user_id, RoomName, | ||||
| }; | ||||
| @ -14,7 +14,7 @@ use serde_json::{from_value as from_json_value, json, to_value as to_json_value} | ||||
| fn serialize_stripped_state_event_any_content() { | ||||
|     let event = StrippedStateEvent { | ||||
|         content: RoomTopicEventContent::new("Testing room".into()), | ||||
|         state_key: "".into(), | ||||
|         state_key: EmptyStateKey, | ||||
|         sender: user_id!("@example:localhost").to_owned(), | ||||
|     }; | ||||
| 
 | ||||
| @ -79,7 +79,6 @@ fn deserialize_stripped_state_events() { | ||||
|     match event { | ||||
|         AnyStrippedStateEvent::RoomName(event) => { | ||||
|             assert_eq!(event.content.name, Some(Box::<RoomName>::try_from("Ruma").unwrap())); | ||||
|             assert_eq!(event.state_key, ""); | ||||
|             assert_eq!(event.sender.to_string(), "@example:localhost"); | ||||
|         } | ||||
|         _ => unreachable!(), | ||||
| @ -89,7 +88,6 @@ fn deserialize_stripped_state_events() { | ||||
|     match event { | ||||
|         AnyStrippedStateEvent::RoomJoinRules(event) => { | ||||
|             assert_eq!(event.content.join_rule, JoinRule::Public); | ||||
|             assert_eq!(event.state_key, ""); | ||||
|             assert_eq!(event.sender.to_string(), "@example:localhost"); | ||||
|         } | ||||
|         _ => unreachable!(), | ||||
| @ -106,7 +104,6 @@ fn deserialize_stripped_state_events() { | ||||
|             assert_eq!(image_info.size.unwrap(), uint!(1024)); | ||||
|             assert_eq!(image_info.thumbnail_info.unwrap().size.unwrap(), uint!(32)); | ||||
|             assert_eq!(event.content.url.unwrap(), mxc_uri!("mxc://example.com/iMag3")); | ||||
|             assert_eq!(event.state_key, ""); | ||||
|             assert_eq!(event.sender.to_string(), "@example:localhost"); | ||||
|         } | ||||
|         _ => unreachable!(), | ||||
|  | ||||
| @ -2,7 +2,7 @@ use ruma_macros::EventContent; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| #[derive(Clone, Debug, Deserialize, Serialize, EventContent)] | ||||
| #[ruma_event(type = "m.macro.test", kind = State)] | ||||
| #[ruma_event(type = "m.macro.test", kind = State, state_key_type = String)] | ||||
| pub struct MacroTestContent { | ||||
|     pub url: String, | ||||
| } | ||||
|  | ||||
| @ -177,7 +177,12 @@ pub fn expand_event_content( | ||||
|     let state_key_types: Vec<_> = | ||||
|         content_attr.iter().filter_map(|attrs| attrs.get_state_key_type()).collect(); | ||||
|     let state_key_type = match (event_kind, state_key_types.as_slice()) { | ||||
|         (Some(EventKind::State), []) => Some(quote! { ::std::string::String }), | ||||
|         (Some(EventKind::State), []) => { | ||||
|             return Err(syn::Error::new( | ||||
|                 Span::call_site(), | ||||
|                 "no state_key_type attribute found, please specify one", | ||||
|             )); | ||||
|         } | ||||
|         (Some(EventKind::State), [ty]) => Some(quote! { #ty }), | ||||
|         (Some(EventKind::State), _) => { | ||||
|             return Err(syn::Error::new( | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user