Skip to main content

tuwunel_core/matrix/event/
format.rs

1use ruma::{
2	CanonicalJsonMemberOptional as JsonMember, CanonicalJsonMembersOptional as JsonMembers,
3	events::{
4		AnyMessageLikeEvent, AnyStateEvent, AnyStrippedStateEvent, AnySyncMessageLikeEvent,
5		AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent, StateEvent, TimelineEventType,
6		room::member::RoomMemberEventContent, space::child::HierarchySpaceChildEvent,
7	},
8	serde::Raw,
9};
10use serde_json::value::to_raw_value;
11
12use super::{Event, redact};
13
14pub struct Owned<E: Event>(pub(super) E);
15
16pub struct Ref<'a, E: Event>(pub(super) &'a E);
17
18impl<E: Event> From<Owned<E>> for Raw<AnySyncTimelineEvent> {
19	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
20}
21
22impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncTimelineEvent> {
23	fn from(event: Ref<'a, E>) -> Self {
24		let event = event.0;
25		let (redacts, content) = redact::copy(event);
26		let members: [JsonMember<_>; _] = [
27			("content", Some(content.json().into())),
28			("event_id", Some(event.event_id().as_str().into())),
29			("origin_server_ts", Some(event.origin_server_ts().get().into())),
30			("redacts", redacts.map(|e| e.as_str().into())),
31			("sender", Some(event.sender().as_str().into())),
32			("state_key", event.state_key().map(Into::into)),
33			("type", Some(event.event_type().to_string().into())),
34			("unsigned", event.unsigned().map(Into::into)),
35		];
36
37		to_raw_value(&JsonMembers(&members))
38			.map(Self::from_json)
39			.expect("Failed to serialize Event value")
40	}
41}
42
43impl<E: Event> From<Owned<E>> for Raw<AnyTimelineEvent> {
44	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
45}
46
47impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyTimelineEvent> {
48	fn from(event: Ref<'a, E>) -> Self {
49		let event = event.0;
50		let (redacts, content) = redact::copy(event);
51		let members: [JsonMember<_>; _] = [
52			("content", Some(content.json().into())),
53			("event_id", Some(event.event_id().as_str().into())),
54			("origin_server_ts", Some(event.origin_server_ts().get().into())),
55			("redacts", redacts.map(|e| e.as_str().into())),
56			("room_id", Some(event.room_id().as_str().into())),
57			("sender", Some(event.sender().as_str().into())),
58			("state_key", event.state_key().map(Into::into)),
59			("type", Some(event.event_type().to_string().into())),
60			("unsigned", event.unsigned().map(Into::into)),
61		];
62
63		to_raw_value(&JsonMembers(&members))
64			.map(Self::from_json)
65			.expect("Failed to serialize Event value")
66	}
67}
68
69impl<E: Event> From<Owned<E>> for Raw<AnyMessageLikeEvent> {
70	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
71}
72
73impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyMessageLikeEvent> {
74	fn from(event: Ref<'a, E>) -> Self {
75		let event = event.0;
76		let (redacts, content) = redact::copy(event);
77		let members: [JsonMember<_>; _] = [
78			("content", Some(content.json().into())),
79			("event_id", Some(event.event_id().as_str().into())),
80			("origin_server_ts", Some(event.origin_server_ts().get().into())),
81			("redacts", redacts.map(|e| e.as_str().into())),
82			("room_id", Some(event.room_id().as_str().into())),
83			("sender", Some(event.sender().as_str().into())),
84			("state_key", event.state_key().map(Into::into)),
85			("type", Some(event.event_type().to_string().into())),
86			("unsigned", event.unsigned().map(Into::into)),
87		];
88
89		to_raw_value(&JsonMembers(&members))
90			.map(Self::from_json)
91			.expect("Failed to serialize Event value")
92	}
93}
94
95impl<E: Event> From<Owned<E>> for Raw<AnySyncMessageLikeEvent> {
96	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
97}
98
99impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncMessageLikeEvent> {
100	fn from(event: Ref<'a, E>) -> Self {
101		let event = event.0;
102		let (redacts, content) = redact::copy(event);
103		let members: [JsonMember<_>; _] = [
104			("content", Some(content.json().into())),
105			("event_id", Some(event.event_id().as_str().into())),
106			("origin_server_ts", Some(event.origin_server_ts().get().into())),
107			("redacts", redacts.map(|e| e.as_str().into())),
108			("sender", Some(event.sender().as_str().into())),
109			("state_key", event.state_key().map(Into::into)),
110			("type", Some(event.event_type().to_string().into())),
111			("unsigned", event.unsigned().map(Into::into)),
112		];
113
114		to_raw_value(&JsonMembers(&members))
115			.map(Self::from_json)
116			.expect("Failed to serialize Event value")
117	}
118}
119
120impl<E: Event> From<Owned<E>> for Raw<AnyStateEvent> {
121	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
122}
123
124impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStateEvent> {
125	fn from(event: Ref<'a, E>) -> Self {
126		let event = event.0;
127		let members: [JsonMember<_>; _] = [
128			("content", Some(event.content().into())),
129			("event_id", Some(event.event_id().as_str().into())),
130			("origin_server_ts", Some(event.origin_server_ts().get().into())),
131			("room_id", Some(event.room_id().as_str().into())),
132			("sender", Some(event.sender().as_str().into())),
133			("state_key", event.state_key().map(Into::into)),
134			("type", Some(event.event_type().to_string().into())),
135			("unsigned", event.unsigned().map(Into::into)),
136		];
137
138		to_raw_value(&JsonMembers(&members))
139			.map(Self::from_json)
140			.expect("Failed to serialize Event value")
141	}
142}
143
144impl<E: Event> From<Owned<E>> for Raw<AnySyncStateEvent> {
145	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
146}
147
148impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncStateEvent> {
149	fn from(event: Ref<'a, E>) -> Self {
150		let event = event.0;
151		let members: [JsonMember<_>; _] = [
152			("content", Some(event.content().into())),
153			("event_id", Some(event.event_id().as_str().into())),
154			("origin_server_ts", Some(event.origin_server_ts().get().into())),
155			("sender", Some(event.sender().as_str().into())),
156			("state_key", event.state_key().map(Into::into)),
157			("type", Some(event.event_type().to_string().into())),
158			("unsigned", event.unsigned().map(Into::into)),
159		];
160
161		to_raw_value(&JsonMembers(&members))
162			.map(Self::from_json)
163			.expect("Failed to serialize Event value")
164	}
165}
166
167impl<E: Event> From<Owned<E>> for Raw<AnyStrippedStateEvent> {
168	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
169}
170
171impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStrippedStateEvent> {
172	fn from(event: Ref<'a, E>) -> Self {
173		let event = event.0;
174		// MSC4311: the create event keeps origin_server_ts in stripped state.
175		let create = matches!(event.event_type(), TimelineEventType::RoomCreate);
176		let members: [JsonMember<_>; _] = [
177			("content", Some(event.content().into())),
178			("origin_server_ts", create.then(|| event.origin_server_ts().get().into())),
179			("sender", Some(event.sender().as_str().into())),
180			("state_key", event.state_key().map(Into::into)),
181			("type", Some(event.event_type().to_string().into())),
182		];
183
184		to_raw_value(&JsonMembers(&members))
185			.map(Self::from_json)
186			.expect("Failed to serialize Event value")
187	}
188}
189
190impl<E: Event> From<Owned<E>> for Raw<HierarchySpaceChildEvent> {
191	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
192}
193
194impl<'a, E: Event> From<Ref<'a, E>> for Raw<HierarchySpaceChildEvent> {
195	fn from(event: Ref<'a, E>) -> Self {
196		let event = event.0;
197		let members: [JsonMember<_>; _] = [
198			("content", Some(event.content().into())),
199			("origin_server_ts", Some(event.origin_server_ts().get().into())),
200			("sender", Some(event.sender().as_str().into())),
201			("state_key", event.state_key().map(Into::into)),
202			("type", Some(event.event_type().to_string().into())),
203		];
204
205		to_raw_value(&JsonMembers(&members))
206			.map(Self::from_json)
207			.expect("Failed to serialize Event value")
208	}
209}
210
211impl<E: Event> From<Owned<E>> for Raw<StateEvent<RoomMemberEventContent>> {
212	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
213}
214
215impl<'a, E: Event> From<Ref<'a, E>> for Raw<StateEvent<RoomMemberEventContent>> {
216	fn from(event: Ref<'a, E>) -> Self {
217		let event = event.0;
218		let members: [JsonMember<_>; _] = [
219			("content", Some(event.content().into())),
220			("event_id", Some(event.event_id().as_str().into())),
221			("origin_server_ts", Some(event.origin_server_ts().get().into())),
222			("redacts", event.redacts().map(|e| e.as_str().into())),
223			("room_id", Some(event.room_id().as_str().into())),
224			("sender", Some(event.sender().as_str().into())),
225			("state_key", event.state_key().map(Into::into)),
226			("type", Some(event.event_type().to_string().into())),
227			("unsigned", event.unsigned().map(Into::into)),
228		];
229
230		to_raw_value(&JsonMembers(&members))
231			.map(Self::from_json)
232			.expect("Failed to serialize Event value")
233	}
234}