use as_variant::as_variant;
use ruma_common::{
EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedUserId, RoomId, UserId,
encryption::DeviceKeys,
room_version_rules::RedactionRules,
serde::{JsonCastable, JsonObject, Raw, from_raw_json_value},
};
use ruma_macros::Event;
use serde::{Deserialize, Deserializer, Serialize, ser::SerializeStruct};
use serde_json::value::RawValue as RawJsonValue;
use super::{
AnyInitialStateEvent, EmptyStateKey, EphemeralRoomEventContent, EventContentFromType,
GlobalAccountDataEventContent, MessageLikeEventContent, MessageLikeEventType,
MessageLikeUnsigned, PossiblyRedactedStateEventContent, RedactContent,
RedactedMessageLikeEventContent, RedactedStateEventContent, RedactedUnsigned,
RedactionDeHelper, RoomAccountDataEventContent, StateEventType, StaticStateEventContent,
ToDeviceEventContent,
};
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct GlobalAccountDataEvent<C: GlobalAccountDataEventContent> {
pub content: C,
}
impl<C: GlobalAccountDataEventContent> GlobalAccountDataEvent<C> {
pub fn new(content: C) -> Self {
Self { content }
}
}
impl<C: GlobalAccountDataEventContent> Serialize for GlobalAccountDataEvent<C> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_struct("GlobalAccountDataEvent", 2)?;
state.serialize_field("type", &self.content.event_type())?;
state.serialize_field("content", &self.content)?;
state.end()
}
}
impl<C: GlobalAccountDataEventContent> JsonCastable<JsonObject> for GlobalAccountDataEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct RoomAccountDataEvent<C: RoomAccountDataEventContent> {
pub content: C,
}
impl<C: RoomAccountDataEventContent> RoomAccountDataEvent<C> {
pub fn new(content: C) -> Self {
Self { content }
}
}
impl<C: RoomAccountDataEventContent> Serialize for RoomAccountDataEvent<C> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_struct("RoomAccountDataEvent", 2)?;
state.serialize_field("type", &self.content.event_type())?;
state.serialize_field("content", &self.content)?;
state.end()
}
}
impl<C: RoomAccountDataEventContent> JsonCastable<JsonObject> for RoomAccountDataEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct EphemeralRoomEvent<C: EphemeralRoomEventContent> {
pub content: C,
pub room_id: OwnedRoomId,
}
impl<C: EphemeralRoomEventContent> EphemeralRoomEvent<C> {
pub fn new(room_id: OwnedRoomId, content: C) -> Self {
Self { content, room_id }
}
}
impl<C: EphemeralRoomEventContent> Serialize for EphemeralRoomEvent<C> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_struct("EphemeralRoomEvent", 2)?;
state.serialize_field("type", &self.content.event_type())?;
state.serialize_field("content", &self.content)?;
state.serialize_field("room_id", &self.room_id)?;
state.end()
}
}
impl<C: EphemeralRoomEventContent> JsonCastable<SyncEphemeralRoomEvent<C>>
for EphemeralRoomEvent<C>
{
}
impl<C: EphemeralRoomEventContent> JsonCastable<JsonObject> for EphemeralRoomEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct SyncEphemeralRoomEvent<C: EphemeralRoomEventContent> {
pub content: C,
}
impl<C: EphemeralRoomEventContent> SyncEphemeralRoomEvent<C> {
pub fn new(content: C) -> Self {
Self { content }
}
}
impl<C: EphemeralRoomEventContent> Serialize for SyncEphemeralRoomEvent<C> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_struct("SyncEphemeralRoomEvent", 2)?;
state.serialize_field("type", &self.content.event_type())?;
state.serialize_field("content", &self.content)?;
state.end()
}
}
impl<C: EphemeralRoomEventContent> JsonCastable<JsonObject> for SyncEphemeralRoomEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct OriginalMessageLikeEvent<C: MessageLikeEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub room_id: OwnedRoomId,
pub unsigned: MessageLikeUnsigned<C>,
}
impl<C: MessageLikeEventContent> JsonCastable<OriginalSyncMessageLikeEvent<C>>
for OriginalMessageLikeEvent<C>
{
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<MessageLikeEvent<C>>
for OriginalMessageLikeEvent<C>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
for OriginalMessageLikeEvent<C>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
impl<C: MessageLikeEventContent> JsonCastable<JsonObject> for OriginalMessageLikeEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct OriginalSyncMessageLikeEvent<C: MessageLikeEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub unsigned: MessageLikeUnsigned<C>,
}
impl<C: MessageLikeEventContent + RedactContent> OriginalSyncMessageLikeEvent<C>
where
C::Redacted: RedactedMessageLikeEventContent,
{
pub(crate) fn into_maybe_redacted(self) -> SyncMessageLikeEvent<C> {
SyncMessageLikeEvent::Original(self)
}
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
for OriginalSyncMessageLikeEvent<C>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
impl<C: MessageLikeEventContent> JsonCastable<JsonObject> for OriginalSyncMessageLikeEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct RedactedMessageLikeEvent<C: RedactedMessageLikeEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub room_id: OwnedRoomId,
pub unsigned: RedactedUnsigned,
}
impl<C: RedactedMessageLikeEventContent> JsonCastable<RedactedSyncMessageLikeEvent<C>>
for RedactedMessageLikeEvent<C>
{
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<MessageLikeEvent<C>>
for RedactedMessageLikeEvent<C::Redacted>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
for RedactedMessageLikeEvent<C::Redacted>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
impl<C: RedactedMessageLikeEventContent> JsonCastable<JsonObject> for RedactedMessageLikeEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct RedactedSyncMessageLikeEvent<C: RedactedMessageLikeEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub unsigned: RedactedUnsigned,
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
for RedactedSyncMessageLikeEvent<C::Redacted>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
impl<C: RedactedMessageLikeEventContent> JsonCastable<JsonObject>
for RedactedSyncMessageLikeEvent<C>
{
}
#[allow(clippy::exhaustive_enums)]
#[derive(Clone, Debug)]
pub enum MessageLikeEvent<C: MessageLikeEventContent + RedactContent>
where
C::Redacted: RedactedMessageLikeEventContent,
{
Original(OriginalMessageLikeEvent<C>),
Redacted(RedactedMessageLikeEvent<C::Redacted>),
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
for MessageLikeEvent<C>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<JsonObject> for MessageLikeEvent<C> where
C::Redacted: RedactedMessageLikeEventContent
{
}
#[allow(clippy::exhaustive_enums)]
#[derive(Clone, Debug)]
pub enum SyncMessageLikeEvent<C: MessageLikeEventContent + RedactContent>
where
C::Redacted: RedactedMessageLikeEventContent,
{
Original(OriginalSyncMessageLikeEvent<C>),
Redacted(RedactedSyncMessageLikeEvent<C::Redacted>),
}
impl<C: MessageLikeEventContent + RedactContent> JsonCastable<JsonObject>
for SyncMessageLikeEvent<C>
where
C::Redacted: RedactedMessageLikeEventContent,
{
}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct OriginalStateEvent<C: StaticStateEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub room_id: OwnedRoomId,
pub state_key: C::StateKey,
pub unsigned: C::Unsigned,
}
impl<C: StaticStateEventContent> JsonCastable<OriginalSyncStateEvent<C>> for OriginalStateEvent<C> {}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<StateEvent<C>>
for OriginalStateEvent<C>
where
C::Redacted: RedactedStateEventContent,
{
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
for OriginalStateEvent<C>
where
C::Redacted: RedactedStateEventContent,
{
}
impl<C: StaticStateEventContent> JsonCastable<StrippedStateEvent<C::PossiblyRedacted>>
for OriginalStateEvent<C>
where
C::PossiblyRedacted: PossiblyRedactedStateEventContent,
{
}
impl<C: StaticStateEventContent> JsonCastable<JsonObject> for OriginalStateEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct OriginalSyncStateEvent<C: StaticStateEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub state_key: C::StateKey,
pub unsigned: C::Unsigned,
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
for OriginalSyncStateEvent<C>
where
C::Redacted: RedactedStateEventContent,
{
}
impl<C: StaticStateEventContent> JsonCastable<StrippedStateEvent<C::PossiblyRedacted>>
for OriginalSyncStateEvent<C>
where
C::PossiblyRedacted: PossiblyRedactedStateEventContent,
{
}
impl<C: StaticStateEventContent> JsonCastable<JsonObject> for OriginalSyncStateEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct StrippedStateEvent<C: PossiblyRedactedStateEventContent> {
pub content: C,
pub sender: OwnedUserId,
pub state_key: C::StateKey,
#[cfg(feature = "unstable-msc4319")]
#[ruma_event(default)]
pub origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
#[cfg(feature = "unstable-msc4319")]
pub unsigned: Option<Raw<crate::StateUnsigned<C>>>,
}
impl<C: PossiblyRedactedStateEventContent> JsonCastable<JsonObject> for StrippedStateEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct InitialStateEvent<C: StaticStateEventContent> {
pub content: C,
pub state_key: C::StateKey,
}
impl<C: StaticStateEventContent> InitialStateEvent<C> {
pub fn new(state_key: C::StateKey, content: C) -> Self {
Self { content, state_key }
}
pub fn with_empty_state_key(content: C) -> Self
where
C: StaticStateEventContent<StateKey = EmptyStateKey>,
{
Self::new(EmptyStateKey, content)
}
pub fn to_raw(&self) -> Raw<Self> {
Raw::new(self).unwrap()
}
pub fn to_raw_any(&self) -> Raw<AnyInitialStateEvent> {
self.to_raw().cast()
}
}
impl<C> Default for InitialStateEvent<C>
where
C: StaticStateEventContent<StateKey = EmptyStateKey> + Default,
{
fn default() -> Self {
Self { content: Default::default(), state_key: EmptyStateKey }
}
}
impl<C: StaticStateEventContent> Serialize for InitialStateEvent<C> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_struct("InitialStateEvent", 3)?;
state.serialize_field("type", &self.content.event_type())?;
state.serialize_field("content", &self.content)?;
state.serialize_field("state_key", &self.state_key)?;
state.end()
}
}
impl<C: StaticStateEventContent> JsonCastable<JsonObject> for InitialStateEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct RedactedStateEvent<C: RedactedStateEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub room_id: OwnedRoomId,
pub state_key: C::StateKey,
pub unsigned: RedactedUnsigned,
}
impl<C: RedactedStateEventContent> JsonCastable<RedactedSyncStateEvent<C>>
for RedactedStateEvent<C>
{
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<StateEvent<C>>
for RedactedStateEvent<C::Redacted>
where
C::Redacted: RedactedStateEventContent,
{
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
for RedactedStateEvent<C::Redacted>
where
C::Redacted: RedactedStateEventContent,
{
}
impl<C: RedactedStateEventContent> JsonCastable<JsonObject> for RedactedStateEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct RedactedSyncStateEvent<C: RedactedStateEventContent> {
pub content: C,
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
pub state_key: C::StateKey,
pub unsigned: RedactedUnsigned,
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
for RedactedSyncStateEvent<C::Redacted>
where
C::Redacted: RedactedStateEventContent,
{
}
impl<C: RedactedStateEventContent> JsonCastable<JsonObject> for RedactedSyncStateEvent<C> {}
#[allow(clippy::exhaustive_enums)]
#[derive(Clone, Debug)]
pub enum StateEvent<C: StaticStateEventContent + RedactContent>
where
C::Redacted: RedactedStateEventContent,
{
Original(OriginalStateEvent<C>),
Redacted(RedactedStateEvent<C::Redacted>),
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>> for StateEvent<C> where
C::Redacted: RedactedStateEventContent
{
}
impl<C: StaticStateEventContent + RedactContent>
JsonCastable<StrippedStateEvent<C::PossiblyRedacted>> for StateEvent<C>
where
C::Redacted: RedactedStateEventContent,
C::PossiblyRedacted: PossiblyRedactedStateEventContent,
{
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<JsonObject> for StateEvent<C> where
C::Redacted: RedactedStateEventContent
{
}
#[allow(clippy::exhaustive_enums)]
#[derive(Clone, Debug)]
pub enum SyncStateEvent<C: StaticStateEventContent + RedactContent>
where
C::Redacted: RedactedStateEventContent,
{
Original(OriginalSyncStateEvent<C>),
Redacted(RedactedSyncStateEvent<C::Redacted>),
}
impl<C: StaticStateEventContent + RedactContent>
JsonCastable<StrippedStateEvent<C::PossiblyRedacted>> for SyncStateEvent<C>
where
C::Redacted: RedactedStateEventContent,
C::PossiblyRedacted: PossiblyRedactedStateEventContent,
{
}
impl<C: StaticStateEventContent + RedactContent> JsonCastable<JsonObject> for SyncStateEvent<C> where
C::Redacted: RedactedStateEventContent
{
}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct ToDeviceEvent<C: ToDeviceEventContent> {
pub content: C,
pub sender: OwnedUserId,
}
impl<C: ToDeviceEventContent> ToDeviceEvent<C> {
pub fn new(sender: OwnedUserId, content: C) -> Self {
Self { content, sender }
}
}
impl<C: ToDeviceEventContent> Serialize for ToDeviceEvent<C> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut state = serializer.serialize_struct("ToDeviceEvent", 3)?;
state.serialize_field("type", &self.content.event_type())?;
state.serialize_field("content", &self.content)?;
state.serialize_field("sender", &self.sender)?;
state.end()
}
}
impl<C: ToDeviceEventContent> JsonCastable<JsonObject> for ToDeviceEvent<C> {}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct DecryptedOlmV1Event<C: MessageLikeEventContent> {
pub content: C,
pub sender: OwnedUserId,
pub recipient: OwnedUserId,
pub recipient_keys: OlmV1Keys,
pub keys: OlmV1Keys,
pub sender_device_keys: Option<Raw<DeviceKeys>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct OlmV1Keys {
pub ed25519: String,
}
impl OlmV1Keys {
pub fn new(ed25519: String) -> Self {
Self { ed25519 }
}
}
#[derive(Clone, Debug, Event)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct DecryptedMegolmV1Event<C: MessageLikeEventContent> {
pub content: C,
pub room_id: OwnedRoomId,
}
#[allow(clippy::exhaustive_enums)]
#[derive(Clone, Debug)]
pub enum StateEventContentChange<C: StaticStateEventContent + RedactContent> {
Original {
content: C,
prev_content: Option<C::PossiblyRedacted>,
},
Redacted(C::Redacted),
}
impl<C: StaticStateEventContent + RedactContent> StateEventContentChange<C>
where
C::Redacted: RedactedStateEventContent,
{
pub fn event_type(&self) -> StateEventType {
match self {
Self::Original { content, .. } => content.event_type(),
Self::Redacted(content) => content.event_type(),
}
}
pub fn redact(self, rules: &RedactionRules) -> C::Redacted {
match self {
Self::Original { content, .. } => content.redact(rules),
Self::Redacted(content) => content,
}
}
}
macro_rules! impl_possibly_redacted_event {
(
$ty:ident ( $content_trait:ident, $redacted_content_trait:ident, $event_type:ident )
$( where C::Redacted: $trait:ident<StateKey = C::StateKey>, )?
{ $($extra:tt)* }
) => {
impl<C> $ty<C>
where
C: $content_trait + RedactContent,
C::Redacted: $redacted_content_trait,
$( C::Redacted: $trait<StateKey = C::StateKey>, )?
{
pub fn event_type(&self) -> $event_type {
match self {
Self::Original(ev) => ev.content.event_type(),
Self::Redacted(ev) => ev.content.event_type(),
}
}
pub fn event_id(&self) -> &EventId {
match self {
Self::Original(ev) => &ev.event_id,
Self::Redacted(ev) => &ev.event_id,
}
}
pub fn sender(&self) -> &UserId {
match self {
Self::Original(ev) => &ev.sender,
Self::Redacted(ev) => &ev.sender,
}
}
pub fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch {
match self {
Self::Original(ev) => ev.origin_server_ts,
Self::Redacted(ev) => ev.origin_server_ts,
}
}
$($extra)*
}
impl<'de, C> Deserialize<'de> for $ty<C>
where
C: $content_trait + EventContentFromType + RedactContent,
C::Redacted: $redacted_content_trait + EventContentFromType,
$( C::Redacted: $trait<StateKey = C::StateKey>, )?
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let RedactionDeHelper { unsigned } = from_raw_json_value(&json)?;
if unsigned.and_then(|u| u.redacted_because).is_some() {
Ok(Self::Redacted(from_raw_json_value(&json)?))
} else {
Ok(Self::Original(from_raw_json_value(&json)?))
}
}
}
}
}
impl_possibly_redacted_event!(
MessageLikeEvent(
MessageLikeEventContent, RedactedMessageLikeEventContent, MessageLikeEventType
) {
pub fn room_id(&self) -> &RoomId {
match self {
Self::Original(ev) => &ev.room_id,
Self::Redacted(ev) => &ev.room_id,
}
}
pub fn as_original(&self) -> Option<&OriginalMessageLikeEvent<C>> {
as_variant!(self, Self::Original)
}
}
);
impl_possibly_redacted_event!(
SyncMessageLikeEvent(
MessageLikeEventContent, RedactedMessageLikeEventContent, MessageLikeEventType
) {
pub fn as_original(&self) -> Option<&OriginalSyncMessageLikeEvent<C>> {
as_variant!(self, Self::Original)
}
pub fn into_full_event(self, room_id: OwnedRoomId) -> MessageLikeEvent<C> {
match self {
Self::Original(ev) => MessageLikeEvent::Original(ev.into_full_event(room_id)),
Self::Redacted(ev) => MessageLikeEvent::Redacted(ev.into_full_event(room_id)),
}
}
}
);
impl_possibly_redacted_event!(
StateEvent(StaticStateEventContent, RedactedStateEventContent, StateEventType)
where
C::Redacted: RedactedStateEventContent<StateKey = C::StateKey>,
{
pub fn room_id(&self) -> &RoomId {
match self {
Self::Original(ev) => &ev.room_id,
Self::Redacted(ev) => &ev.room_id,
}
}
pub fn state_key(&self) -> &C::StateKey {
match self {
Self::Original(ev) => &ev.state_key,
Self::Redacted(ev) => &ev.state_key,
}
}
pub fn as_original(&self) -> Option<&OriginalStateEvent<C>> {
as_variant!(self, Self::Original)
}
}
);
impl_possibly_redacted_event!(
SyncStateEvent(StaticStateEventContent, RedactedStateEventContent, StateEventType)
where
C::Redacted: RedactedStateEventContent<StateKey = C::StateKey>,
{
pub fn state_key(&self) -> &C::StateKey {
match self {
Self::Original(ev) => &ev.state_key,
Self::Redacted(ev) => &ev.state_key,
}
}
pub fn as_original(&self) -> Option<&OriginalSyncStateEvent<C>> {
as_variant!(self, Self::Original)
}
pub fn into_full_event(self, room_id: OwnedRoomId) -> StateEvent<C> {
match self {
Self::Original(ev) => StateEvent::Original(ev.into_full_event(room_id)),
Self::Redacted(ev) => StateEvent::Redacted(ev.into_full_event(room_id)),
}
}
}
);
macro_rules! impl_sync_from_full {
($ty:ident, $full:ident, $content_trait:ident, $redacted_content_trait: ident) => {
impl<C> From<$full<C>> for $ty<C>
where
C: $content_trait + RedactContent,
C::Redacted: $redacted_content_trait,
{
fn from(full: $full<C>) -> Self {
match full {
$full::Original(ev) => Self::Original(ev.into()),
$full::Redacted(ev) => Self::Redacted(ev.into()),
}
}
}
};
}
impl_sync_from_full!(
SyncMessageLikeEvent,
MessageLikeEvent,
MessageLikeEventContent,
RedactedMessageLikeEventContent
);
impl_sync_from_full!(
SyncStateEvent,
StateEvent,
StaticStateEventContent,
RedactedStateEventContent
);