1use as_variant::as_variant;
2use ruma_common::{
3 EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedUserId, RoomId, UserId,
4 encryption::DeviceKeys,
5 room_version_rules::RedactionRules,
6 serde::{JsonCastable, JsonObject, Raw, from_raw_json_value},
7};
8use ruma_macros::Event;
9use serde::{Deserialize, Deserializer, Serialize, ser::SerializeStruct};
10use serde_json::value::RawValue as RawJsonValue;
11
12use super::{
13 AnyInitialStateEvent, EmptyStateKey, EphemeralRoomEventContent, EventContentFromType,
14 GlobalAccountDataEventContent, MessageLikeEventContent, MessageLikeEventType,
15 MessageLikeUnsigned, PossiblyRedactedStateEventContent, RedactContent,
16 RedactedMessageLikeEventContent, RedactedStateEventContent, RedactedUnsigned,
17 RedactionDeHelper, RoomAccountDataEventContent, StateEventType, StaticStateEventContent,
18 ToDeviceEventContent,
19};
20#[cfg(feature = "unstable-msc4354")]
21use crate::sticky::StickyObject;
22
23#[derive(Clone, Debug, Event)]
25#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
26pub struct GlobalAccountDataEvent<C: GlobalAccountDataEventContent> {
27 pub content: C,
29}
30
31impl<C: GlobalAccountDataEventContent> GlobalAccountDataEvent<C> {
32 pub fn new(content: C) -> Self {
34 Self { content }
35 }
36}
37
38impl<C: GlobalAccountDataEventContent> Serialize for GlobalAccountDataEvent<C> {
39 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
40 where
41 S: serde::Serializer,
42 {
43 let mut state = serializer.serialize_struct("GlobalAccountDataEvent", 2)?;
44 state.serialize_field("type", &self.content.event_type())?;
45 state.serialize_field("content", &self.content)?;
46 state.end()
47 }
48}
49
50impl<C: GlobalAccountDataEventContent> JsonCastable<JsonObject> for GlobalAccountDataEvent<C> {}
51
52#[derive(Clone, Debug, Event)]
54#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
55pub struct RoomAccountDataEvent<C: RoomAccountDataEventContent> {
56 pub content: C,
58}
59
60impl<C: RoomAccountDataEventContent> RoomAccountDataEvent<C> {
61 pub fn new(content: C) -> Self {
63 Self { content }
64 }
65}
66
67impl<C: RoomAccountDataEventContent> Serialize for RoomAccountDataEvent<C> {
68 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
69 where
70 S: serde::Serializer,
71 {
72 let mut state = serializer.serialize_struct("RoomAccountDataEvent", 2)?;
73 state.serialize_field("type", &self.content.event_type())?;
74 state.serialize_field("content", &self.content)?;
75 state.end()
76 }
77}
78
79impl<C: RoomAccountDataEventContent> JsonCastable<JsonObject> for RoomAccountDataEvent<C> {}
80
81#[derive(Clone, Debug, Event)]
83#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
84pub struct EphemeralRoomEvent<C: EphemeralRoomEventContent> {
85 pub content: C,
87
88 pub room_id: OwnedRoomId,
90}
91
92impl<C: EphemeralRoomEventContent> EphemeralRoomEvent<C> {
93 pub fn new(room_id: OwnedRoomId, content: C) -> Self {
95 Self { content, room_id }
96 }
97}
98
99impl<C: EphemeralRoomEventContent> Serialize for EphemeralRoomEvent<C> {
100 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
101 where
102 S: serde::Serializer,
103 {
104 let mut state = serializer.serialize_struct("EphemeralRoomEvent", 2)?;
105 state.serialize_field("type", &self.content.event_type())?;
106 state.serialize_field("content", &self.content)?;
107 state.serialize_field("room_id", &self.room_id)?;
108 state.end()
109 }
110}
111
112impl<C: EphemeralRoomEventContent> JsonCastable<SyncEphemeralRoomEvent<C>>
113 for EphemeralRoomEvent<C>
114{
115}
116
117impl<C: EphemeralRoomEventContent> JsonCastable<JsonObject> for EphemeralRoomEvent<C> {}
118
119#[derive(Clone, Debug, Event)]
121#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
122pub struct SyncEphemeralRoomEvent<C: EphemeralRoomEventContent> {
123 pub content: C,
125}
126
127impl<C: EphemeralRoomEventContent> SyncEphemeralRoomEvent<C> {
128 pub fn new(content: C) -> Self {
130 Self { content }
131 }
132}
133
134impl<C: EphemeralRoomEventContent> Serialize for SyncEphemeralRoomEvent<C> {
135 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
136 where
137 S: serde::Serializer,
138 {
139 let mut state = serializer.serialize_struct("SyncEphemeralRoomEvent", 2)?;
140 state.serialize_field("type", &self.content.event_type())?;
141 state.serialize_field("content", &self.content)?;
142 state.end()
143 }
144}
145
146impl<C: EphemeralRoomEventContent> JsonCastable<JsonObject> for SyncEphemeralRoomEvent<C> {}
147
148#[derive(Clone, Debug, Event)]
153#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
154pub struct OriginalMessageLikeEvent<C: MessageLikeEventContent> {
155 pub content: C,
157
158 pub event_id: OwnedEventId,
160
161 pub sender: OwnedUserId,
163
164 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
166
167 pub room_id: OwnedRoomId,
169
170 pub unsigned: MessageLikeUnsigned<C>,
172
173 #[cfg(feature = "unstable-msc4354")]
177 #[ruma_event(default, default_on_error, rename = "msc4354_sticky")]
178 pub sticky: Option<StickyObject>,
179}
180
181impl<C: MessageLikeEventContent> JsonCastable<OriginalSyncMessageLikeEvent<C>>
182 for OriginalMessageLikeEvent<C>
183{
184}
185
186impl<C: MessageLikeEventContent + RedactContent> JsonCastable<MessageLikeEvent<C>>
187 for OriginalMessageLikeEvent<C>
188where
189 C::Redacted: RedactedMessageLikeEventContent,
190{
191}
192
193impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
194 for OriginalMessageLikeEvent<C>
195where
196 C::Redacted: RedactedMessageLikeEventContent,
197{
198}
199
200impl<C: MessageLikeEventContent> JsonCastable<JsonObject> for OriginalMessageLikeEvent<C> {}
201
202#[derive(Clone, Debug, Event)]
207#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
208pub struct OriginalSyncMessageLikeEvent<C: MessageLikeEventContent> {
209 pub content: C,
211
212 pub event_id: OwnedEventId,
214
215 pub sender: OwnedUserId,
217
218 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
220
221 pub unsigned: MessageLikeUnsigned<C>,
223
224 #[cfg(feature = "unstable-msc4354")]
228 #[ruma_event(default, default_on_error, rename = "msc4354_sticky")]
229 pub sticky: Option<StickyObject>,
230}
231
232impl<C: MessageLikeEventContent + RedactContent> OriginalSyncMessageLikeEvent<C>
233where
234 C::Redacted: RedactedMessageLikeEventContent,
235{
236 pub(crate) fn into_maybe_redacted(self) -> SyncMessageLikeEvent<C> {
237 SyncMessageLikeEvent::Original(self)
238 }
239}
240
241impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
242 for OriginalSyncMessageLikeEvent<C>
243where
244 C::Redacted: RedactedMessageLikeEventContent,
245{
246}
247
248impl<C: MessageLikeEventContent> JsonCastable<JsonObject> for OriginalSyncMessageLikeEvent<C> {}
249
250#[derive(Clone, Debug, Event)]
255#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
256pub struct RedactedMessageLikeEvent<C: RedactedMessageLikeEventContent> {
257 pub content: C,
259
260 pub event_id: OwnedEventId,
262
263 pub sender: OwnedUserId,
265
266 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
268
269 pub room_id: OwnedRoomId,
271
272 pub unsigned: RedactedUnsigned,
274}
275
276impl<C: RedactedMessageLikeEventContent> JsonCastable<RedactedSyncMessageLikeEvent<C>>
277 for RedactedMessageLikeEvent<C>
278{
279}
280
281impl<C: MessageLikeEventContent + RedactContent> JsonCastable<MessageLikeEvent<C>>
282 for RedactedMessageLikeEvent<C::Redacted>
283where
284 C::Redacted: RedactedMessageLikeEventContent,
285{
286}
287
288impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
289 for RedactedMessageLikeEvent<C::Redacted>
290where
291 C::Redacted: RedactedMessageLikeEventContent,
292{
293}
294
295impl<C: RedactedMessageLikeEventContent> JsonCastable<JsonObject> for RedactedMessageLikeEvent<C> {}
296
297#[derive(Clone, Debug, Event)]
302#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
303pub struct RedactedSyncMessageLikeEvent<C: RedactedMessageLikeEventContent> {
304 pub content: C,
306
307 pub event_id: OwnedEventId,
309
310 pub sender: OwnedUserId,
312
313 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
315
316 pub unsigned: RedactedUnsigned,
318}
319
320impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
321 for RedactedSyncMessageLikeEvent<C::Redacted>
322where
323 C::Redacted: RedactedMessageLikeEventContent,
324{
325}
326
327impl<C: RedactedMessageLikeEventContent> JsonCastable<JsonObject>
328 for RedactedSyncMessageLikeEvent<C>
329{
330}
331
332#[allow(clippy::exhaustive_enums)]
337#[derive(Clone, Debug)]
338pub enum MessageLikeEvent<C: MessageLikeEventContent + RedactContent>
339where
340 C::Redacted: RedactedMessageLikeEventContent,
341{
342 Original(OriginalMessageLikeEvent<C>),
344
345 Redacted(RedactedMessageLikeEvent<C::Redacted>),
347}
348
349impl<C: MessageLikeEventContent + RedactContent> JsonCastable<SyncMessageLikeEvent<C>>
350 for MessageLikeEvent<C>
351where
352 C::Redacted: RedactedMessageLikeEventContent,
353{
354}
355
356impl<C: MessageLikeEventContent + RedactContent> JsonCastable<JsonObject> for MessageLikeEvent<C> where
357 C::Redacted: RedactedMessageLikeEventContent
358{
359}
360
361#[allow(clippy::exhaustive_enums)]
366#[derive(Clone, Debug)]
367pub enum SyncMessageLikeEvent<C: MessageLikeEventContent + RedactContent>
368where
369 C::Redacted: RedactedMessageLikeEventContent,
370{
371 Original(OriginalSyncMessageLikeEvent<C>),
373
374 Redacted(RedactedSyncMessageLikeEvent<C::Redacted>),
376}
377
378impl<C: MessageLikeEventContent + RedactContent> JsonCastable<JsonObject>
379 for SyncMessageLikeEvent<C>
380where
381 C::Redacted: RedactedMessageLikeEventContent,
382{
383}
384
385#[derive(Clone, Debug, Event)]
390#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
391pub struct OriginalStateEvent<C: StaticStateEventContent> {
392 pub content: C,
394
395 pub event_id: OwnedEventId,
397
398 pub sender: OwnedUserId,
400
401 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
403
404 pub room_id: OwnedRoomId,
406
407 pub state_key: C::StateKey,
414
415 pub unsigned: C::Unsigned,
417
418 #[cfg(feature = "unstable-msc4354")]
422 #[ruma_event(default, default_on_error, rename = "msc4354_sticky")]
423 pub sticky: Option<StickyObject>,
424}
425
426impl<C: StaticStateEventContent> JsonCastable<OriginalSyncStateEvent<C>> for OriginalStateEvent<C> {}
427
428impl<C: StaticStateEventContent + RedactContent> JsonCastable<StateEvent<C>>
429 for OriginalStateEvent<C>
430where
431 C::Redacted: RedactedStateEventContent,
432{
433}
434
435impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
436 for OriginalStateEvent<C>
437where
438 C::Redacted: RedactedStateEventContent,
439{
440}
441
442impl<C: StaticStateEventContent> JsonCastable<StrippedStateEvent<C::PossiblyRedacted>>
443 for OriginalStateEvent<C>
444where
445 C::PossiblyRedacted: PossiblyRedactedStateEventContent,
446{
447}
448
449impl<C: StaticStateEventContent> JsonCastable<JsonObject> for OriginalStateEvent<C> {}
450
451#[derive(Clone, Debug, Event)]
456#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
457pub struct OriginalSyncStateEvent<C: StaticStateEventContent> {
458 pub content: C,
460
461 pub event_id: OwnedEventId,
463
464 pub sender: OwnedUserId,
466
467 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
469
470 pub state_key: C::StateKey,
477
478 pub unsigned: C::Unsigned,
480
481 #[cfg(feature = "unstable-msc4354")]
485 #[ruma_event(default, default_on_error, rename = "msc4354_sticky")]
486 pub sticky: Option<StickyObject>,
487}
488
489impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
490 for OriginalSyncStateEvent<C>
491where
492 C::Redacted: RedactedStateEventContent,
493{
494}
495
496impl<C: StaticStateEventContent> JsonCastable<StrippedStateEvent<C::PossiblyRedacted>>
497 for OriginalSyncStateEvent<C>
498where
499 C::PossiblyRedacted: PossiblyRedactedStateEventContent,
500{
501}
502
503impl<C: StaticStateEventContent> JsonCastable<JsonObject> for OriginalSyncStateEvent<C> {}
504
505#[derive(Clone, Debug, Event)]
507#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
508pub struct StrippedStateEvent<C: PossiblyRedactedStateEventContent> {
509 pub content: C,
511
512 pub sender: OwnedUserId,
514
515 pub state_key: C::StateKey,
522
523 #[cfg(feature = "unstable-msc4319")]
527 #[ruma_event(default)]
528 pub origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
529
530 #[cfg(feature = "unstable-msc4319")]
532 pub unsigned: Option<Raw<crate::StateUnsigned<C>>>,
533}
534
535impl<C: PossiblyRedactedStateEventContent> JsonCastable<JsonObject> for StrippedStateEvent<C> {}
536
537#[derive(Clone, Debug, Event)]
539#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
540pub struct InitialStateEvent<C: StaticStateEventContent> {
541 pub content: C,
543
544 pub state_key: C::StateKey,
553}
554
555impl<C: StaticStateEventContent> InitialStateEvent<C> {
556 pub fn new(state_key: C::StateKey, content: C) -> Self {
561 Self { content, state_key }
562 }
563
564 pub fn with_empty_state_key(content: C) -> Self
568 where
569 C: StaticStateEventContent<StateKey = EmptyStateKey>,
570 {
571 Self::new(EmptyStateKey, content)
572 }
573
574 pub fn to_raw(&self) -> Raw<Self> {
582 Raw::new(self).unwrap()
583 }
584
585 pub fn to_raw_any(&self) -> Raw<AnyInitialStateEvent> {
593 self.to_raw().cast()
594 }
595}
596
597impl<C> Default for InitialStateEvent<C>
598where
599 C: StaticStateEventContent<StateKey = EmptyStateKey> + Default,
600{
601 fn default() -> Self {
602 Self { content: Default::default(), state_key: EmptyStateKey }
603 }
604}
605
606impl<C: StaticStateEventContent> Serialize for InitialStateEvent<C> {
607 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
608 where
609 S: serde::Serializer,
610 {
611 let mut state = serializer.serialize_struct("InitialStateEvent", 3)?;
612 state.serialize_field("type", &self.content.event_type())?;
613 state.serialize_field("content", &self.content)?;
614 state.serialize_field("state_key", &self.state_key)?;
615 state.end()
616 }
617}
618
619impl<C: StaticStateEventContent> JsonCastable<JsonObject> for InitialStateEvent<C> {}
620
621#[derive(Clone, Debug, Event)]
626#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
627pub struct RedactedStateEvent<C: RedactedStateEventContent> {
628 pub content: C,
630
631 pub event_id: OwnedEventId,
633
634 pub sender: OwnedUserId,
636
637 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
639
640 pub room_id: OwnedRoomId,
642
643 pub state_key: C::StateKey,
650
651 pub unsigned: RedactedUnsigned,
653}
654
655impl<C: RedactedStateEventContent> JsonCastable<RedactedSyncStateEvent<C>>
656 for RedactedStateEvent<C>
657{
658}
659
660impl<C: StaticStateEventContent + RedactContent> JsonCastable<StateEvent<C>>
661 for RedactedStateEvent<C::Redacted>
662where
663 C::Redacted: RedactedStateEventContent,
664{
665}
666
667impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
668 for RedactedStateEvent<C::Redacted>
669where
670 C::Redacted: RedactedStateEventContent,
671{
672}
673
674impl<C: RedactedStateEventContent> JsonCastable<JsonObject> for RedactedStateEvent<C> {}
675
676#[derive(Clone, Debug, Event)]
681#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
682pub struct RedactedSyncStateEvent<C: RedactedStateEventContent> {
683 pub content: C,
685
686 pub event_id: OwnedEventId,
688
689 pub sender: OwnedUserId,
691
692 pub origin_server_ts: MilliSecondsSinceUnixEpoch,
694
695 pub state_key: C::StateKey,
702
703 pub unsigned: RedactedUnsigned,
705}
706
707impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>>
708 for RedactedSyncStateEvent<C::Redacted>
709where
710 C::Redacted: RedactedStateEventContent,
711{
712}
713
714impl<C: RedactedStateEventContent> JsonCastable<JsonObject> for RedactedSyncStateEvent<C> {}
715
716#[allow(clippy::exhaustive_enums)]
721#[derive(Clone, Debug)]
722pub enum StateEvent<C: StaticStateEventContent + RedactContent>
723where
724 C::Redacted: RedactedStateEventContent,
725{
726 Original(OriginalStateEvent<C>),
728
729 Redacted(RedactedStateEvent<C::Redacted>),
731}
732
733impl<C: StaticStateEventContent + RedactContent> JsonCastable<SyncStateEvent<C>> for StateEvent<C> where
734 C::Redacted: RedactedStateEventContent
735{
736}
737
738impl<C: StaticStateEventContent + RedactContent>
739 JsonCastable<StrippedStateEvent<C::PossiblyRedacted>> for StateEvent<C>
740where
741 C::Redacted: RedactedStateEventContent,
742 C::PossiblyRedacted: PossiblyRedactedStateEventContent,
743{
744}
745
746impl<C: StaticStateEventContent + RedactContent> JsonCastable<JsonObject> for StateEvent<C> where
747 C::Redacted: RedactedStateEventContent
748{
749}
750
751#[allow(clippy::exhaustive_enums)]
756#[derive(Clone, Debug)]
757pub enum SyncStateEvent<C: StaticStateEventContent + RedactContent>
758where
759 C::Redacted: RedactedStateEventContent,
760{
761 Original(OriginalSyncStateEvent<C>),
763
764 Redacted(RedactedSyncStateEvent<C::Redacted>),
766}
767
768impl<C: StaticStateEventContent + RedactContent>
769 JsonCastable<StrippedStateEvent<C::PossiblyRedacted>> for SyncStateEvent<C>
770where
771 C::Redacted: RedactedStateEventContent,
772 C::PossiblyRedacted: PossiblyRedactedStateEventContent,
773{
774}
775
776impl<C: StaticStateEventContent + RedactContent> JsonCastable<JsonObject> for SyncStateEvent<C> where
777 C::Redacted: RedactedStateEventContent
778{
779}
780
781#[derive(Clone, Debug, Event)]
783#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
784pub struct ToDeviceEvent<C: ToDeviceEventContent> {
785 pub content: C,
787
788 pub sender: OwnedUserId,
790}
791
792impl<C: ToDeviceEventContent> ToDeviceEvent<C> {
793 pub fn new(sender: OwnedUserId, content: C) -> Self {
795 Self { content, sender }
796 }
797}
798
799impl<C: ToDeviceEventContent> Serialize for ToDeviceEvent<C> {
800 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
801 where
802 S: serde::Serializer,
803 {
804 let mut state = serializer.serialize_struct("ToDeviceEvent", 3)?;
805 state.serialize_field("type", &self.content.event_type())?;
806 state.serialize_field("content", &self.content)?;
807 state.serialize_field("sender", &self.sender)?;
808 state.end()
809 }
810}
811
812impl<C: ToDeviceEventContent> JsonCastable<JsonObject> for ToDeviceEvent<C> {}
813
814#[derive(Clone, Debug, Event)]
816#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
817pub struct DecryptedOlmV1Event<C: MessageLikeEventContent> {
818 pub content: C,
820
821 pub sender: OwnedUserId,
823
824 pub recipient: OwnedUserId,
826
827 pub recipient_keys: OlmV1Keys,
829
830 pub keys: OlmV1Keys,
832
833 pub sender_device_keys: Option<Raw<DeviceKeys>>,
835}
836
837#[derive(Clone, Debug, Deserialize, Serialize)]
839#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
840pub struct OlmV1Keys {
841 pub ed25519: String,
843}
844
845impl OlmV1Keys {
846 pub fn new(ed25519: String) -> Self {
848 Self { ed25519 }
849 }
850}
851
852#[derive(Clone, Debug, Event)]
854#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
855pub struct DecryptedMegolmV1Event<C: MessageLikeEventContent> {
856 pub content: C,
858
859 pub room_id: OwnedRoomId,
861}
862
863#[allow(clippy::exhaustive_enums)]
866#[derive(Clone, Debug)]
867pub enum StateEventContentChange<C: StaticStateEventContent + RedactContent> {
868 Original {
870 content: C,
872
873 prev_content: Option<C::PossiblyRedacted>,
875 },
876
877 Redacted(C::Redacted),
879}
880
881impl<C: StaticStateEventContent + RedactContent> StateEventContentChange<C>
882where
883 C::Redacted: RedactedStateEventContent,
884{
885 pub fn event_type(&self) -> StateEventType {
887 match self {
888 Self::Original { content, .. } => content.event_type(),
889 Self::Redacted(content) => content.event_type(),
890 }
891 }
892
893 pub fn redact(self, rules: &RedactionRules) -> C::Redacted {
900 match self {
901 Self::Original { content, .. } => content.redact(rules),
902 Self::Redacted(content) => content,
903 }
904 }
905}
906
907macro_rules! impl_possibly_redacted_event {
908 (
909 $ty:ident ( $content_trait:ident, $redacted_content_trait:ident, $event_type:ident )
910 $( where C::Redacted: $trait:ident<StateKey = C::StateKey>, )?
911 { $($extra:tt)* }
912 ) => {
913 impl<C> $ty<C>
914 where
915 C: $content_trait + RedactContent,
916 C::Redacted: $redacted_content_trait,
917 $( C::Redacted: $trait<StateKey = C::StateKey>, )?
918 {
919 pub fn event_type(&self) -> $event_type {
921 match self {
922 Self::Original(ev) => ev.content.event_type(),
923 Self::Redacted(ev) => ev.content.event_type(),
924 }
925 }
926
927 pub fn event_id(&self) -> &EventId {
929 match self {
930 Self::Original(ev) => &ev.event_id,
931 Self::Redacted(ev) => &ev.event_id,
932 }
933 }
934
935 pub fn sender(&self) -> &UserId {
937 match self {
938 Self::Original(ev) => &ev.sender,
939 Self::Redacted(ev) => &ev.sender,
940 }
941 }
942
943 pub fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch {
945 match self {
946 Self::Original(ev) => ev.origin_server_ts,
947 Self::Redacted(ev) => ev.origin_server_ts,
948 }
949 }
950
951 $($extra)*
953 }
954
955 impl<'de, C> Deserialize<'de> for $ty<C>
956 where
957 C: $content_trait + EventContentFromType + RedactContent,
958 C::Redacted: $redacted_content_trait + EventContentFromType,
959 $( C::Redacted: $trait<StateKey = C::StateKey>, )?
960 {
961 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
962 where
963 D: Deserializer<'de>,
964 {
965 let json = Box::<RawJsonValue>::deserialize(deserializer)?;
966 let RedactionDeHelper { unsigned } = from_raw_json_value(&json)?;
967
968 if unsigned.and_then(|u| u.redacted_because).is_some() {
969 Ok(Self::Redacted(from_raw_json_value(&json)?))
970 } else {
971 Ok(Self::Original(from_raw_json_value(&json)?))
972 }
973 }
974 }
975 }
976}
977
978impl_possibly_redacted_event!(
979 MessageLikeEvent(
980 MessageLikeEventContent, RedactedMessageLikeEventContent, MessageLikeEventType
981 ) {
982 pub fn room_id(&self) -> &RoomId {
984 match self {
985 Self::Original(ev) => &ev.room_id,
986 Self::Redacted(ev) => &ev.room_id,
987 }
988 }
989
990 pub fn as_original(&self) -> Option<&OriginalMessageLikeEvent<C>> {
992 as_variant!(self, Self::Original)
993 }
994 }
995);
996
997impl_possibly_redacted_event!(
998 SyncMessageLikeEvent(
999 MessageLikeEventContent, RedactedMessageLikeEventContent, MessageLikeEventType
1000 ) {
1001 pub fn as_original(&self) -> Option<&OriginalSyncMessageLikeEvent<C>> {
1003 as_variant!(self, Self::Original)
1004 }
1005
1006 pub fn into_full_event(self, room_id: OwnedRoomId) -> MessageLikeEvent<C> {
1008 match self {
1009 Self::Original(ev) => MessageLikeEvent::Original(ev.into_full_event(room_id)),
1010 Self::Redacted(ev) => MessageLikeEvent::Redacted(ev.into_full_event(room_id)),
1011 }
1012 }
1013 }
1014);
1015
1016impl_possibly_redacted_event!(
1017 StateEvent(StaticStateEventContent, RedactedStateEventContent, StateEventType)
1018 where
1019 C::Redacted: RedactedStateEventContent<StateKey = C::StateKey>,
1020 {
1021 pub fn room_id(&self) -> &RoomId {
1023 match self {
1024 Self::Original(ev) => &ev.room_id,
1025 Self::Redacted(ev) => &ev.room_id,
1026 }
1027 }
1028
1029 pub fn state_key(&self) -> &C::StateKey {
1031 match self {
1032 Self::Original(ev) => &ev.state_key,
1033 Self::Redacted(ev) => &ev.state_key,
1034 }
1035 }
1036
1037 pub fn as_original(&self) -> Option<&OriginalStateEvent<C>> {
1039 as_variant!(self, Self::Original)
1040 }
1041 }
1042);
1043
1044impl_possibly_redacted_event!(
1045 SyncStateEvent(StaticStateEventContent, RedactedStateEventContent, StateEventType)
1046 where
1047 C::Redacted: RedactedStateEventContent<StateKey = C::StateKey>,
1048 {
1049 pub fn state_key(&self) -> &C::StateKey {
1051 match self {
1052 Self::Original(ev) => &ev.state_key,
1053 Self::Redacted(ev) => &ev.state_key,
1054 }
1055 }
1056
1057 pub fn as_original(&self) -> Option<&OriginalSyncStateEvent<C>> {
1059 as_variant!(self, Self::Original)
1060 }
1061
1062 pub fn into_full_event(self, room_id: OwnedRoomId) -> StateEvent<C> {
1064 match self {
1065 Self::Original(ev) => StateEvent::Original(ev.into_full_event(room_id)),
1066 Self::Redacted(ev) => StateEvent::Redacted(ev.into_full_event(room_id)),
1067 }
1068 }
1069 }
1070);
1071
1072macro_rules! impl_sync_from_full {
1073 ($ty:ident, $full:ident, $content_trait:ident, $redacted_content_trait: ident) => {
1074 impl<C> From<$full<C>> for $ty<C>
1075 where
1076 C: $content_trait + RedactContent,
1077 C::Redacted: $redacted_content_trait,
1078 {
1079 fn from(full: $full<C>) -> Self {
1080 match full {
1081 $full::Original(ev) => Self::Original(ev.into()),
1082 $full::Redacted(ev) => Self::Redacted(ev.into()),
1083 }
1084 }
1085 }
1086 };
1087}
1088
1089impl_sync_from_full!(
1090 SyncMessageLikeEvent,
1091 MessageLikeEvent,
1092 MessageLikeEventContent,
1093 RedactedMessageLikeEventContent
1094);
1095impl_sync_from_full!(
1096 SyncStateEvent,
1097 StateEvent,
1098 StaticStateEventContent,
1099 RedactedStateEventContent
1100);