Skip to main content

arminius_lib_events/
fields.rs

1// SPDX-FileCopyrightText: 2025 BWI GmbH
2//
3// SPDX-License-Identifier: Apache-2.0
4
5//! Utility traits for RoomEvents, which allows accessing fields that would
6//! otherwise be deep inside the structs
7
8use std::borrow::Cow;
9
10use ruma::{MilliSecondsSinceUnixEpoch, events::TimelineEventType};
11
12use crate::{
13	Contextualized, Draft, EventHash, EventRefs, KnownRoomVersionId, RoomEvent, Signed,
14	VerificationMetadata, Verified,
15};
16
17/// A trait which accesses fields of a draft event
18pub trait DraftFields {
19	/// Get the event type of the event
20	fn event_type(&self) -> &TimelineEventType;
21	/// Get the sender of the event
22	fn sender(&self) -> &ruma::UserId;
23	/// Get the state key of the event
24	fn state_key(&self) -> Option<&str>;
25	/// Get the content of the event
26	fn content(&self) -> Cow<'_, serde_json::value::RawValue>;
27	/// Get the event redacted, if exists
28	fn redacts(&self) -> Option<&ruma::EventId>;
29}
30
31/// A trait which accesses fields of a contextualized event
32pub trait ContextualizedFields: DraftFields {
33	/// Get the `origin_server_ts` field of the event
34	fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch;
35	/// Get the `auth_events` field of the event
36	fn auth_events(&self) -> &EventRefs;
37	/// Get the `prev_events` field of the event
38	fn prev_events(&self) -> &EventRefs;
39	/// Get the `depth` field of the event
40	fn depth(&self) -> u64;
41	/// Get the `room_version` field of the event
42	fn room_version(&self) -> KnownRoomVersionId;
43	/// Get the ID of the event
44	fn event_id(&self) -> &ruma::EventId;
45	/// Get the ID of the room
46	fn room_id(&self) -> &ruma::RoomId;
47	/// Get the content hash of the event
48	fn hashes(&self) -> &EventHash;
49}
50
51/// A trait which accesses fields of a signed event
52pub trait SignedFields: ContextualizedFields {
53	/// Get the signatures of the event
54	fn signatures(&self) -> &ruma::ServerSignatures;
55}
56
57/// A trait which accesses fields of a verified event
58pub trait VerifiedFields: SignedFields {
59	/// Get the verification metadata for the event
60	fn metadata(&self) -> &VerificationMetadata;
61
62	/// Whether the event was soft-failed during verification.
63	///
64	/// See [`VerificationMetadata::soft_failed`] for details.
65	fn soft_failed(&self) -> bool {
66		self.metadata().soft_failed
67	}
68}
69
70impl DraftFields for RoomEvent<Draft> {
71	fn event_type(&self) -> &TimelineEventType {
72		&self.state.timeline_event_type
73	}
74
75	fn sender(&self) -> &ruma::UserId {
76		&self.state.sender
77	}
78
79	fn state_key(&self) -> Option<&str> {
80		self.state.state_key.as_deref()
81	}
82
83	fn content(&self) -> Cow<'_, serde_json::value::RawValue> {
84		Cow::Borrowed(&self.state.content)
85	}
86
87	fn redacts(&self) -> Option<&ruma::EventId> {
88		self.state.redacts.as_deref()
89	}
90}
91
92impl DraftFields for RoomEvent<Contextualized> {
93	fn event_type(&self) -> &TimelineEventType {
94		&self.state.draft.timeline_event_type
95	}
96
97	fn sender(&self) -> &ruma::UserId {
98		&self.state.draft.sender
99	}
100
101	fn state_key(&self) -> Option<&str> {
102		self.state.draft.state_key.as_deref()
103	}
104
105	fn content(&self) -> Cow<'_, serde_json::value::RawValue> {
106		Cow::Borrowed(&self.state.draft.content)
107	}
108
109	fn redacts(&self) -> Option<&ruma::EventId> {
110		self.state.draft.redacts.as_deref()
111	}
112}
113
114impl DraftFields for RoomEvent<Signed> {
115	fn event_type(&self) -> &TimelineEventType {
116		&self.state.contextualized.draft.timeline_event_type
117	}
118
119	fn sender(&self) -> &ruma::UserId {
120		&self.state.contextualized.draft.sender
121	}
122
123	fn state_key(&self) -> Option<&str> {
124		self.state.contextualized.draft.state_key.as_deref()
125	}
126
127	fn content(&self) -> Cow<'_, serde_json::value::RawValue> {
128		Cow::Borrowed(&self.state.contextualized.draft.content)
129	}
130
131	fn redacts(&self) -> Option<&ruma::EventId> {
132		self.state.contextualized.draft.redacts.as_deref()
133	}
134}
135
136impl DraftFields for RoomEvent<Verified> {
137	fn event_type(&self) -> &TimelineEventType {
138		&self.state.signed.contextualized.draft.timeline_event_type
139	}
140
141	fn sender(&self) -> &ruma::UserId {
142		&self.state.signed.contextualized.draft.sender
143	}
144
145	fn state_key(&self) -> Option<&str> {
146		self.state.signed.contextualized.draft.state_key.as_deref()
147	}
148
149	fn content(&self) -> Cow<'_, serde_json::value::RawValue> {
150		Cow::Borrowed(&self.state.signed.contextualized.draft.content)
151	}
152
153	fn redacts(&self) -> Option<&ruma::EventId> {
154		self.state.signed.contextualized.draft.redacts.as_deref()
155	}
156}
157
158impl ContextualizedFields for RoomEvent<Contextualized> {
159	fn auth_events(&self) -> &EventRefs {
160		&self.state.auth_events
161	}
162
163	fn prev_events(&self) -> &EventRefs {
164		&self.state.prev_events
165	}
166
167	fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch {
168		self.state.origin_server_ts
169	}
170
171	fn room_version(&self) -> KnownRoomVersionId {
172		self.state.room_version
173	}
174
175	fn depth(&self) -> u64 {
176		self.state.depth
177	}
178
179	fn event_id(&self) -> &ruma::EventId {
180		&self.state.event_id
181	}
182
183	fn room_id(&self) -> &ruma::RoomId {
184		&self.state.room_id
185	}
186
187	fn hashes(&self) -> &EventHash {
188		&self.state.hashes
189	}
190}
191
192impl ContextualizedFields for RoomEvent<Signed> {
193	fn auth_events(&self) -> &EventRefs {
194		&self.state.contextualized.auth_events
195	}
196
197	fn prev_events(&self) -> &EventRefs {
198		&self.state.contextualized.prev_events
199	}
200
201	fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch {
202		self.state.contextualized.origin_server_ts
203	}
204
205	fn room_version(&self) -> KnownRoomVersionId {
206		self.state.contextualized.room_version
207	}
208
209	fn depth(&self) -> u64 {
210		self.state.contextualized.depth
211	}
212
213	fn event_id(&self) -> &ruma::EventId {
214		&self.state.contextualized.event_id
215	}
216	fn room_id(&self) -> &ruma::RoomId {
217		&self.state.contextualized.room_id
218	}
219	fn hashes(&self) -> &EventHash {
220		&self.state.contextualized.hashes
221	}
222}
223
224impl ContextualizedFields for RoomEvent<Verified> {
225	fn auth_events(&self) -> &EventRefs {
226		&self.state.signed.contextualized.auth_events
227	}
228
229	fn prev_events(&self) -> &EventRefs {
230		&self.state.signed.contextualized.prev_events
231	}
232
233	fn origin_server_ts(&self) -> MilliSecondsSinceUnixEpoch {
234		self.state.signed.contextualized.origin_server_ts
235	}
236
237	fn room_version(&self) -> KnownRoomVersionId {
238		self.state.signed.contextualized.room_version
239	}
240
241	fn depth(&self) -> u64 {
242		self.state.signed.contextualized.depth
243	}
244
245	fn event_id(&self) -> &ruma::EventId {
246		&self.state.signed.contextualized.event_id
247	}
248
249	fn room_id(&self) -> &ruma::RoomId {
250		&self.state.signed.contextualized.room_id
251	}
252	fn hashes(&self) -> &EventHash {
253		&self.state.signed.contextualized.hashes
254	}
255}
256
257impl SignedFields for RoomEvent<Signed> {
258	fn signatures(&self) -> &ruma::ServerSignatures {
259		&self.state.signatures
260	}
261}
262
263impl SignedFields for RoomEvent<Verified> {
264	fn signatures(&self) -> &ruma::ServerSignatures {
265		&self.state.signed.signatures
266	}
267}
268
269impl VerifiedFields for RoomEvent<Verified> {
270	fn metadata(&self) -> &VerificationMetadata {
271		&self.state.metadata
272	}
273}