events: Reintroduce *EventContent as trait aliases
This commit is contained in:
parent
9f56e6e497
commit
5ec3ad2290
@ -7,7 +7,10 @@ pub mod v3 {
|
||||
|
||||
use ruma_common::{
|
||||
api::ruma_api,
|
||||
events::{AnyGlobalAccountDataEventContent, EventContent, GlobalAccountDataEventType},
|
||||
events::{
|
||||
AnyGlobalAccountDataEventContent, GlobalAccountDataEventContent,
|
||||
GlobalAccountDataEventType,
|
||||
},
|
||||
serde::Raw,
|
||||
UserId,
|
||||
};
|
||||
@ -60,7 +63,7 @@ pub mod v3 {
|
||||
/// `T`s [`Serialize`][serde::Serialize] implementation can fail.
|
||||
pub fn new<T>(data: &'a T, user_id: &'a UserId) -> serde_json::Result<Self>
|
||||
where
|
||||
T: EventContent<EventType = GlobalAccountDataEventType>,
|
||||
T: GlobalAccountDataEventContent,
|
||||
{
|
||||
Ok(Self {
|
||||
user_id,
|
||||
|
@ -7,7 +7,9 @@ pub mod v3 {
|
||||
|
||||
use ruma_common::{
|
||||
api::ruma_api,
|
||||
events::{AnyRoomAccountDataEventContent, EventContent, RoomAccountDataEventType},
|
||||
events::{
|
||||
AnyRoomAccountDataEventContent, RoomAccountDataEventContent, RoomAccountDataEventType,
|
||||
},
|
||||
serde::Raw,
|
||||
RoomId, UserId,
|
||||
};
|
||||
@ -68,7 +70,7 @@ pub mod v3 {
|
||||
user_id: &'a UserId,
|
||||
) -> serde_json::Result<Self>
|
||||
where
|
||||
T: EventContent<EventType = RoomAccountDataEventType>,
|
||||
T: RoomAccountDataEventContent,
|
||||
{
|
||||
Ok(Self {
|
||||
data: Raw::from_json(to_raw_json_value(data)?),
|
||||
|
@ -7,7 +7,7 @@ pub mod v3 {
|
||||
|
||||
use ruma_common::{
|
||||
api::ruma_api,
|
||||
events::{AnyMessageLikeEventContent, EventContent, MessageLikeEventType},
|
||||
events::{AnyMessageLikeEventContent, MessageLikeEventContent, MessageLikeEventType},
|
||||
serde::Raw,
|
||||
EventId, RoomId, TransactionId,
|
||||
};
|
||||
@ -68,7 +68,7 @@ pub mod v3 {
|
||||
content: &'a T,
|
||||
) -> serde_json::Result<Self>
|
||||
where
|
||||
T: EventContent<EventType = MessageLikeEventType>,
|
||||
T: MessageLikeEventContent,
|
||||
{
|
||||
Ok(Self {
|
||||
room_id,
|
||||
|
@ -7,7 +7,7 @@ pub mod v3 {
|
||||
|
||||
use ruma_common::{
|
||||
api::ruma_api,
|
||||
events::{AnyStateEventContent, EventContent, StateEventType},
|
||||
events::{AnyStateEventContent, StateEventContent, StateEventType},
|
||||
serde::{Incoming, Raw},
|
||||
EventId, RoomId,
|
||||
};
|
||||
@ -66,7 +66,7 @@ pub mod v3 {
|
||||
content: &'a T,
|
||||
) -> serde_json::Result<Self>
|
||||
where
|
||||
T: EventContent<EventType = StateEventType>,
|
||||
T: StateEventContent,
|
||||
{
|
||||
Ok(Self {
|
||||
room_id,
|
||||
|
@ -5,6 +5,11 @@ use serde_json::value::RawValue as RawJsonValue;
|
||||
|
||||
use crate::serde::Raw;
|
||||
|
||||
use super::{
|
||||
EphemeralRoomEventType, GlobalAccountDataEventType, MessageLikeEventType,
|
||||
RoomAccountDataEventType, StateEventType, ToDeviceEventType,
|
||||
};
|
||||
|
||||
/// The base trait that all event content types implement.
|
||||
///
|
||||
/// Use [`macros::EventContent`] to derive this traits. It is not meant to be implemented manually.
|
||||
@ -128,3 +133,46 @@ pub enum EventKind {
|
||||
/// Presence event kind.
|
||||
Presence,
|
||||
}
|
||||
|
||||
macro_rules! trait_aliases {
|
||||
// need to use `,` instead of `+` because (1) path can't be followed by `+`
|
||||
// and (2) `+` can't be used as a separator since it's a repetition operator
|
||||
($(
|
||||
$( #[doc = $docs:literal] )*
|
||||
trait $id:ident = $( $def:path ),+;
|
||||
)*) => {
|
||||
$(
|
||||
$( #[doc = $docs] )*
|
||||
pub trait $id: $($def+)+ {}
|
||||
impl<T: $($def+)+> $id for T {}
|
||||
)*
|
||||
}
|
||||
}
|
||||
|
||||
trait_aliases! {
|
||||
/// An alias for `EventContent<EventType = GlobalAccountDataEventType>`.
|
||||
trait GlobalAccountDataEventContent = EventContent<EventType = GlobalAccountDataEventType>;
|
||||
|
||||
/// An alias for `EventContent<EventType = RoomAccountDataEventType>`.
|
||||
trait RoomAccountDataEventContent = EventContent<EventType = RoomAccountDataEventType>;
|
||||
|
||||
/// An alias for `EventContent<EventType = EphemeralRoomEventType>`.
|
||||
trait EphemeralRoomEventContent = EventContent<EventType = EphemeralRoomEventType>;
|
||||
|
||||
/// An alias for `EventContent<EventType = MessageLikeEventType>`.
|
||||
trait MessageLikeEventContent = EventContent<EventType = MessageLikeEventType>;
|
||||
|
||||
/// An alias for `EventContent<EventType = MessageLikeEventType> + RedactedEventContent`.
|
||||
trait RedactedMessageLikeEventContent =
|
||||
EventContent<EventType = MessageLikeEventType>, RedactedEventContent;
|
||||
|
||||
/// An alias for `EventContent<EventType = StateEventType>`.
|
||||
trait StateEventContent = EventContent<EventType = StateEventType>;
|
||||
|
||||
/// An alias for `EventContent<EventType = StateEventType> + RedactedEventContent`.
|
||||
trait RedactedStateEventContent =
|
||||
EventContent<EventType = StateEventType>, RedactedEventContent;
|
||||
|
||||
/// An alias for `EventContent<EventType = ToDeviceEventType>`.
|
||||
trait ToDeviceEventContent = EventContent<EventType = ToDeviceEventType>;
|
||||
}
|
||||
|
@ -4,29 +4,30 @@ use ruma_macros::Event;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use super::{
|
||||
EphemeralRoomEventType, EventContent, GlobalAccountDataEventType, MessageLikeEventType,
|
||||
MessageLikeUnsigned, RedactedEventContent, RedactedUnsigned, RoomAccountDataEventType,
|
||||
StateEventType, StateUnsigned, ToDeviceEventType,
|
||||
EphemeralRoomEventContent, GlobalAccountDataEventContent, MessageLikeEventContent,
|
||||
MessageLikeEventType, MessageLikeUnsigned, RedactedMessageLikeEventContent,
|
||||
RedactedStateEventContent, RedactedUnsigned, RoomAccountDataEventContent, StateEventContent,
|
||||
StateEventType, StateUnsigned, ToDeviceEventContent,
|
||||
};
|
||||
use crate::{EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId};
|
||||
|
||||
/// A global account data event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct GlobalAccountDataEvent<C: EventContent<EventType = GlobalAccountDataEventType>> {
|
||||
pub struct GlobalAccountDataEvent<C: GlobalAccountDataEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
}
|
||||
|
||||
/// A room account data event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct RoomAccountDataEvent<C: EventContent<EventType = RoomAccountDataEventType>> {
|
||||
pub struct RoomAccountDataEvent<C: RoomAccountDataEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
}
|
||||
|
||||
/// An ephemeral room event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct EphemeralRoomEvent<C: EventContent<EventType = EphemeralRoomEventType>> {
|
||||
pub struct EphemeralRoomEvent<C: EphemeralRoomEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -36,7 +37,7 @@ pub struct EphemeralRoomEvent<C: EventContent<EventType = EphemeralRoomEventType
|
||||
|
||||
/// An ephemeral room event without a `room_id`.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct SyncEphemeralRoomEvent<C: EventContent<EventType = EphemeralRoomEventType>> {
|
||||
pub struct SyncEphemeralRoomEvent<C: EphemeralRoomEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
}
|
||||
@ -46,7 +47,7 @@ pub struct SyncEphemeralRoomEvent<C: EventContent<EventType = EphemeralRoomEvent
|
||||
/// `MessageLikeEvent` 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 MessageLikeEvent<C: EventContent<EventType = MessageLikeEventType>> {
|
||||
pub struct MessageLikeEvent<C: MessageLikeEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -71,7 +72,7 @@ pub struct MessageLikeEvent<C: EventContent<EventType = MessageLikeEventType>> {
|
||||
/// `SyncMessageLikeEvent` 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 SyncMessageLikeEvent<C: EventContent<EventType = MessageLikeEventType>> {
|
||||
pub struct SyncMessageLikeEvent<C: MessageLikeEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -93,9 +94,7 @@ pub struct SyncMessageLikeEvent<C: EventContent<EventType = MessageLikeEventType
|
||||
/// `RedactedMessageLikeEvent` 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 RedactedMessageLikeEvent<
|
||||
C: EventContent<EventType = MessageLikeEventType> + RedactedEventContent,
|
||||
> {
|
||||
pub struct RedactedMessageLikeEvent<C: RedactedMessageLikeEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -120,9 +119,7 @@ pub struct RedactedMessageLikeEvent<
|
||||
/// `RedactedSyncMessageLikeEvent` 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 RedactedSyncMessageLikeEvent<
|
||||
C: EventContent<EventType = MessageLikeEventType> + RedactedEventContent,
|
||||
> {
|
||||
pub struct RedactedSyncMessageLikeEvent<C: RedactedMessageLikeEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -144,7 +141,7 @@ pub struct RedactedSyncMessageLikeEvent<
|
||||
/// `StateEvent` 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 StateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
pub struct StateEvent<C: StateEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -175,7 +172,7 @@ pub struct StateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
/// `SyncStateEvent` 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 SyncStateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
pub struct SyncStateEvent<C: StateEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -200,7 +197,7 @@ pub struct SyncStateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
|
||||
/// A stripped-down state event, used for previews of rooms the user has been invited to.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct StrippedStateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
pub struct StrippedStateEvent<C: StateEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -216,7 +213,7 @@ pub struct StrippedStateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
|
||||
/// A minimal state event, used for creating a new room.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct InitialStateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
pub struct InitialStateEvent<C: StateEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -235,7 +232,7 @@ pub struct InitialStateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
/// `RedactedStateEvent` 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 RedactedStateEvent<C: EventContent<EventType = StateEventType> + RedactedEventContent> {
|
||||
pub struct RedactedStateEvent<C: RedactedStateEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -266,9 +263,7 @@ pub struct RedactedStateEvent<C: EventContent<EventType = StateEventType> + Reda
|
||||
/// `RedactedSyncStateEvent` 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 RedactedSyncStateEvent<
|
||||
C: EventContent<EventType = StateEventType> + RedactedEventContent,
|
||||
> {
|
||||
pub struct RedactedSyncStateEvent<C: RedactedStateEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -293,7 +288,7 @@ pub struct RedactedSyncStateEvent<
|
||||
|
||||
/// An event sent using send-to-device messaging.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct ToDeviceEvent<C: EventContent<EventType = ToDeviceEventType>> {
|
||||
pub struct ToDeviceEvent<C: ToDeviceEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -303,7 +298,7 @@ pub struct ToDeviceEvent<C: EventContent<EventType = ToDeviceEventType>> {
|
||||
|
||||
/// The decrypted payload of an `m.olm.v1.curve25519-aes-sha2` event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct DecryptedOlmV1Event<C: EventContent<EventType = MessageLikeEventType>> {
|
||||
pub struct DecryptedOlmV1Event<C: MessageLikeEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
@ -329,7 +324,7 @@ pub struct OlmV1Keys {
|
||||
|
||||
/// The decrypted payload of an `m.megolm.v1.aes-sha2` event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct DecryptedMegolmV1Event<C: EventContent<EventType = MessageLikeEventType>> {
|
||||
pub struct DecryptedMegolmV1Event<C: MessageLikeEventContent> {
|
||||
/// Data specific to the event type.
|
||||
pub content: C,
|
||||
|
||||
|
@ -4,7 +4,7 @@ use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue};
|
||||
|
||||
#[cfg(feature = "unstable-msc2675")]
|
||||
use super::relation::Relations;
|
||||
use super::{room::redaction::SyncRoomRedactionEvent, EventContent, StateEventType};
|
||||
use super::{room::redaction::SyncRoomRedactionEvent, StateEventContent};
|
||||
use crate::{serde::Raw, TransactionId};
|
||||
|
||||
/// Extra information about a message event that is not incorporated into the event's hash.
|
||||
@ -57,7 +57,7 @@ impl MessageLikeUnsigned {
|
||||
/// Extra information about a state event that is not incorporated into the event's hash.
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||
pub struct StateUnsigned<C: EventContent<EventType = StateEventType>> {
|
||||
pub struct StateUnsigned<C: StateEventContent> {
|
||||
/// The time in milliseconds that has elapsed since the event was sent.
|
||||
///
|
||||
/// This field is generated by the local homeserver, and may be incorrect if the local time on
|
||||
@ -81,7 +81,7 @@ pub struct StateUnsigned<C: EventContent<EventType = StateEventType>> {
|
||||
pub relations: Option<Relations>,
|
||||
}
|
||||
|
||||
impl<C: EventContent<EventType = StateEventType>> StateUnsigned<C> {
|
||||
impl<C: StateEventContent> StateUnsigned<C> {
|
||||
/// Create a new `Unsigned` with fields set to `None`.
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
@ -118,7 +118,7 @@ impl<C: EventContent<EventType = StateEventType>> StateUnsigned<C> {
|
||||
///
|
||||
/// Needs to be public for UI tests.
|
||||
#[doc(hidden)]
|
||||
impl<C: EventContent<EventType = StateEventType>> StateUnsigned<C> {
|
||||
impl<C: StateEventContent> StateUnsigned<C> {
|
||||
pub fn _from_parts(event_type: &str, object: &RawJsonValue) -> serde_json::Result<Self> {
|
||||
#[derive(Deserialize)]
|
||||
#[serde(bound = "")] // Disable default C: Deserialize bound
|
||||
@ -148,7 +148,7 @@ impl<C: EventContent<EventType = StateEventType>> StateUnsigned<C> {
|
||||
|
||||
pub fn _map_prev_unsigned<T>(&self, f: impl FnOnce(&C) -> T) -> StateUnsigned<T>
|
||||
where
|
||||
T: EventContent<EventType = StateEventType>,
|
||||
T: StateEventContent,
|
||||
{
|
||||
StateUnsigned {
|
||||
age: self.age,
|
||||
@ -160,7 +160,7 @@ impl<C: EventContent<EventType = StateEventType>> StateUnsigned<C> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<C: EventContent<EventType = StateEventType>> Default for StateUnsigned<C> {
|
||||
impl<C: StateEventContent> Default for StateUnsigned<C> {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
|
@ -4,14 +4,14 @@
|
||||
extern crate serde;
|
||||
|
||||
use ruma_common::{
|
||||
events::{EventContent, StateEventType, StateUnsigned},
|
||||
events::{StateEventContent, StateUnsigned},
|
||||
EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId,
|
||||
};
|
||||
use ruma_macros::Event;
|
||||
|
||||
/// State event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct StateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
pub struct StateEvent<C: StateEventContent> {
|
||||
pub content: C,
|
||||
pub event_id: Box<EventId>,
|
||||
pub sender: Box<UserId>,
|
||||
|
@ -1,8 +1,8 @@
|
||||
use ruma_common::events::{EventContent, StateEventType};
|
||||
use ruma_common::events::StateEventContent;
|
||||
use ruma_macros::Event;
|
||||
|
||||
/// State event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct StateEvent<C: EventContent<EventType = StateEventType>>(C);
|
||||
pub struct StateEvent<C: StateEventContent>(C);
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: the `Event` derive only supports structs with named fields
|
||||
--> tests/events/ui/05-named-fields.rs:6:12
|
||||
|
|
||||
6 | pub struct StateEvent<C: EventContent<EventType = StateEventType>>(C);
|
||||
6 | pub struct StateEvent<C: StateEventContent>(C);
|
||||
| ^^^^^^^^^^
|
||||
|
@ -1,9 +1,9 @@
|
||||
use ruma_common::events::{EventContent, StateEventType};
|
||||
use ruma_common::events::StateEventContent;
|
||||
use ruma_macros::Event;
|
||||
|
||||
/// State event.
|
||||
#[derive(Clone, Debug, Event)]
|
||||
pub struct StateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
pub struct StateEvent<C: StateEventContent> {
|
||||
pub not_content: C,
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: struct must contain a `content` field
|
||||
--> $DIR/06-no-content-field.rs:5:24
|
||||
--> tests/events/ui/06-no-content-field.rs:5:24
|
||||
|
|
||||
5 | #[derive(Clone, Debug, Event)]
|
||||
| ^^^^^
|
||||
|
Loading…
x
Reference in New Issue
Block a user