ruma_state_res/events/
traits.rs

1use std::{
2    borrow::Borrow,
3    fmt::{Debug, Display},
4    hash::Hash,
5    sync::Arc,
6};
7
8use ruma_common::{EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId};
9use ruma_events::TimelineEventType;
10use serde_json::value::RawValue as RawJsonValue;
11
12/// Abstraction of a PDU so users can have their own PDU types.
13pub trait Event {
14    /// The type used to represent the ID of an event.
15    type Id: Clone + Debug + Display + Eq + Ord + Hash + Borrow<EventId>;
16
17    /// The ID of this event.
18    fn event_id(&self) -> &Self::Id;
19
20    /// The `RoomId` of this event.
21    fn room_id(&self) -> Option<&RoomId>;
22
23    /// The `UserId` of this event.
24    fn sender(&self) -> &UserId;
25
26    /// The time of creation on the originating server.
27    fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch;
28
29    /// The event type.
30    fn event_type(&self) -> &TimelineEventType;
31
32    /// The event's content.
33    fn content(&self) -> &RawJsonValue;
34
35    /// The state key for this event.
36    fn state_key(&self) -> Option<&str>;
37
38    /// The events before this event.
39    // Requires GATs to avoid boxing (and TAIT for making it convenient).
40    fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &Self::Id> + '_>;
41
42    /// All the authenticating events for this event.
43    // Requires GATs to avoid boxing (and TAIT for making it convenient).
44    fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &Self::Id> + '_>;
45
46    /// If this event is a redaction event this is the event it redacts.
47    fn redacts(&self) -> Option<&Self::Id>;
48
49    /// Whether this event was rejected for not passing the checks on reception of a PDU.
50    fn rejected(&self) -> bool;
51}
52
53impl<T: Event> Event for &T {
54    type Id = T::Id;
55
56    fn event_id(&self) -> &Self::Id {
57        (*self).event_id()
58    }
59
60    fn room_id(&self) -> Option<&RoomId> {
61        (*self).room_id()
62    }
63
64    fn sender(&self) -> &UserId {
65        (*self).sender()
66    }
67
68    fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch {
69        (*self).origin_server_ts()
70    }
71
72    fn event_type(&self) -> &TimelineEventType {
73        (*self).event_type()
74    }
75
76    fn content(&self) -> &RawJsonValue {
77        (*self).content()
78    }
79
80    fn state_key(&self) -> Option<&str> {
81        (*self).state_key()
82    }
83
84    fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &Self::Id> + '_> {
85        (*self).prev_events()
86    }
87
88    fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &Self::Id> + '_> {
89        (*self).auth_events()
90    }
91
92    fn redacts(&self) -> Option<&Self::Id> {
93        (*self).redacts()
94    }
95
96    fn rejected(&self) -> bool {
97        (*self).rejected()
98    }
99}
100
101impl<T: Event> Event for Arc<T> {
102    type Id = T::Id;
103
104    fn event_id(&self) -> &Self::Id {
105        (**self).event_id()
106    }
107
108    fn room_id(&self) -> Option<&RoomId> {
109        (**self).room_id()
110    }
111
112    fn sender(&self) -> &UserId {
113        (**self).sender()
114    }
115
116    fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch {
117        (**self).origin_server_ts()
118    }
119
120    fn event_type(&self) -> &TimelineEventType {
121        (**self).event_type()
122    }
123
124    fn content(&self) -> &RawJsonValue {
125        (**self).content()
126    }
127
128    fn state_key(&self) -> Option<&str> {
129        (**self).state_key()
130    }
131
132    fn prev_events(&self) -> Box<dyn DoubleEndedIterator<Item = &Self::Id> + '_> {
133        (**self).prev_events()
134    }
135
136    fn auth_events(&self) -> Box<dyn DoubleEndedIterator<Item = &Self::Id> + '_> {
137        (**self).auth_events()
138    }
139
140    fn redacts(&self) -> Option<&Self::Id> {
141        (**self).redacts()
142    }
143
144    fn rejected(&self) -> bool {
145        (**self).rejected()
146    }
147}