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::copy};
13
14/// Owns an event for conversion into a Ruma event envelope.
15///
16/// `From` implementations select the fields required by each client event
17/// shape. Consuming the wrapper also consumes the source event.
18pub struct Owned<E: Event>(pub(super) E);
19
20/// Borrows an event for conversion into a Ruma event envelope.
21///
22/// `From` implementations select the fields required by each client event
23/// shape. The source event remains available after conversion.
24pub struct Ref<'a, E: Event>(pub(super) &'a E);
25
26pub(super) fn to_sync_message_like_without_unsigned<E: Event>(
27	event: &E,
28) -> Raw<AnySyncMessageLikeEvent> {
29	let (redacts, content) = copy(event);
30	let event_type = event.event_type().to_cow_str();
31	let members: [JsonMember<_>; _] = [
32		("content", Some(content.json().into())),
33		("event_id", Some(event.event_id().as_str().into())),
34		("origin_server_ts", Some(event.origin_server_ts().get().into())),
35		("redacts", redacts.map(|e| e.as_str().into())),
36		("sender", Some(event.sender().as_str().into())),
37		("state_key", event.state_key().map(Into::into)),
38		("type", Some(event_type.as_ref().into())),
39		("unsigned", None),
40	];
41
42	to_raw_value(&JsonMembers(&members))
43		.map(Raw::from_json)
44		.expect("Failed to serialize Event value")
45}
46
47impl<E: Event> From<Owned<E>> for Raw<AnySyncTimelineEvent> {
48	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
49}
50
51impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncTimelineEvent> {
52	fn from(event: Ref<'a, E>) -> Self {
53		let event = event.0;
54		let (redacts, content) = copy(event);
55		let members: [JsonMember<_>; _] = [
56			("content", Some(content.json().into())),
57			("event_id", Some(event.event_id().as_str().into())),
58			("origin_server_ts", Some(event.origin_server_ts().get().into())),
59			("redacts", redacts.map(|e| e.as_str().into())),
60			("sender", Some(event.sender().as_str().into())),
61			("state_key", event.state_key().map(Into::into)),
62			("type", Some(event.event_type().to_string().into())),
63			("unsigned", event.unsigned().map(Into::into)),
64		];
65
66		to_raw_value(&JsonMembers(&members))
67			.map(Self::from_json)
68			.expect("Failed to serialize Event value")
69	}
70}
71
72impl<E: Event> From<Owned<E>> for Raw<AnyTimelineEvent> {
73	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
74}
75
76impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyTimelineEvent> {
77	fn from(event: Ref<'a, E>) -> Self {
78		let event = event.0;
79		let (redacts, content) = copy(event);
80		let members: [JsonMember<_>; _] = [
81			("content", Some(content.json().into())),
82			("event_id", Some(event.event_id().as_str().into())),
83			("origin_server_ts", Some(event.origin_server_ts().get().into())),
84			("redacts", redacts.map(|e| e.as_str().into())),
85			("room_id", Some(event.room_id().as_str().into())),
86			("sender", Some(event.sender().as_str().into())),
87			("state_key", event.state_key().map(Into::into)),
88			("type", Some(event.event_type().to_string().into())),
89			("unsigned", event.unsigned().map(Into::into)),
90		];
91
92		to_raw_value(&JsonMembers(&members))
93			.map(Self::from_json)
94			.expect("Failed to serialize Event value")
95	}
96}
97
98impl<E: Event> From<Owned<E>> for Raw<AnyMessageLikeEvent> {
99	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
100}
101
102impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyMessageLikeEvent> {
103	fn from(event: Ref<'a, E>) -> Self {
104		let event = event.0;
105		let (redacts, content) = copy(event);
106		let members: [JsonMember<_>; _] = [
107			("content", Some(content.json().into())),
108			("event_id", Some(event.event_id().as_str().into())),
109			("origin_server_ts", Some(event.origin_server_ts().get().into())),
110			("redacts", redacts.map(|e| e.as_str().into())),
111			("room_id", Some(event.room_id().as_str().into())),
112			("sender", Some(event.sender().as_str().into())),
113			("state_key", event.state_key().map(Into::into)),
114			("type", Some(event.event_type().to_string().into())),
115			("unsigned", event.unsigned().map(Into::into)),
116		];
117
118		to_raw_value(&JsonMembers(&members))
119			.map(Self::from_json)
120			.expect("Failed to serialize Event value")
121	}
122}
123
124impl<E: Event> From<Owned<E>> for Raw<AnySyncMessageLikeEvent> {
125	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
126}
127
128impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncMessageLikeEvent> {
129	fn from(event: Ref<'a, E>) -> Self {
130		let event = event.0;
131		let (redacts, content) = copy(event);
132		let members: [JsonMember<_>; _] = [
133			("content", Some(content.json().into())),
134			("event_id", Some(event.event_id().as_str().into())),
135			("origin_server_ts", Some(event.origin_server_ts().get().into())),
136			("redacts", redacts.map(|e| e.as_str().into())),
137			("sender", Some(event.sender().as_str().into())),
138			("state_key", event.state_key().map(Into::into)),
139			("type", Some(event.event_type().to_string().into())),
140			("unsigned", event.unsigned().map(Into::into)),
141		];
142
143		to_raw_value(&JsonMembers(&members))
144			.map(Self::from_json)
145			.expect("Failed to serialize Event value")
146	}
147}
148
149impl<E: Event> From<Owned<E>> for Raw<AnyStateEvent> {
150	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
151}
152
153impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStateEvent> {
154	fn from(event: Ref<'a, E>) -> Self {
155		let event = event.0;
156		let members: [JsonMember<_>; _] = [
157			("content", Some(event.content().into())),
158			("event_id", Some(event.event_id().as_str().into())),
159			("origin_server_ts", Some(event.origin_server_ts().get().into())),
160			("room_id", Some(event.room_id().as_str().into())),
161			("sender", Some(event.sender().as_str().into())),
162			("state_key", event.state_key().map(Into::into)),
163			("type", Some(event.event_type().to_string().into())),
164			("unsigned", event.unsigned().map(Into::into)),
165		];
166
167		to_raw_value(&JsonMembers(&members))
168			.map(Self::from_json)
169			.expect("Failed to serialize Event value")
170	}
171}
172
173impl<E: Event> From<Owned<E>> for Raw<AnySyncStateEvent> {
174	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
175}
176
177impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncStateEvent> {
178	fn from(event: Ref<'a, E>) -> Self {
179		let event = event.0;
180		let members: [JsonMember<_>; _] = [
181			("content", Some(event.content().into())),
182			("event_id", Some(event.event_id().as_str().into())),
183			("origin_server_ts", Some(event.origin_server_ts().get().into())),
184			("sender", Some(event.sender().as_str().into())),
185			("state_key", event.state_key().map(Into::into)),
186			("type", Some(event.event_type().to_string().into())),
187			("unsigned", event.unsigned().map(Into::into)),
188		];
189
190		to_raw_value(&JsonMembers(&members))
191			.map(Self::from_json)
192			.expect("Failed to serialize Event value")
193	}
194}
195
196impl<E: Event> From<Owned<E>> for Raw<AnyStrippedStateEvent> {
197	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
198}
199
200impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStrippedStateEvent> {
201	fn from(event: Ref<'a, E>) -> Self {
202		let event = event.0;
203		// MSC4311: the create event keeps origin_server_ts in stripped state.
204		let create = matches!(event.event_type(), TimelineEventType::RoomCreate);
205		let members: [JsonMember<_>; _] = [
206			("content", Some(event.content().into())),
207			("origin_server_ts", create.then(|| event.origin_server_ts().get().into())),
208			("sender", Some(event.sender().as_str().into())),
209			("state_key", event.state_key().map(Into::into)),
210			("type", Some(event.event_type().to_string().into())),
211		];
212
213		to_raw_value(&JsonMembers(&members))
214			.map(Self::from_json)
215			.expect("Failed to serialize Event value")
216	}
217}
218
219impl<E: Event> From<Owned<E>> for Raw<HierarchySpaceChildEvent> {
220	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
221}
222
223impl<'a, E: Event> From<Ref<'a, E>> for Raw<HierarchySpaceChildEvent> {
224	fn from(event: Ref<'a, E>) -> Self {
225		let event = event.0;
226		let members: [JsonMember<_>; _] = [
227			("content", Some(event.content().into())),
228			("origin_server_ts", Some(event.origin_server_ts().get().into())),
229			("sender", Some(event.sender().as_str().into())),
230			("state_key", event.state_key().map(Into::into)),
231			("type", Some(event.event_type().to_string().into())),
232		];
233
234		to_raw_value(&JsonMembers(&members))
235			.map(Self::from_json)
236			.expect("Failed to serialize Event value")
237	}
238}
239
240impl<E: Event> From<Owned<E>> for Raw<StateEvent<RoomMemberEventContent>> {
241	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
242}
243
244impl<'a, E: Event> From<Ref<'a, E>> for Raw<StateEvent<RoomMemberEventContent>> {
245	fn from(event: Ref<'a, E>) -> Self {
246		let event = event.0;
247		let members: [JsonMember<_>; _] = [
248			("content", Some(event.content().into())),
249			("event_id", Some(event.event_id().as_str().into())),
250			("origin_server_ts", Some(event.origin_server_ts().get().into())),
251			("redacts", event.redacts().map(|e| e.as_str().into())),
252			("room_id", Some(event.room_id().as_str().into())),
253			("sender", Some(event.sender().as_str().into())),
254			("state_key", event.state_key().map(Into::into)),
255			("type", Some(event.event_type().to_string().into())),
256			("unsigned", event.unsigned().map(Into::into)),
257		];
258
259		to_raw_value(&JsonMembers(&members))
260			.map(Self::from_json)
261			.expect("Failed to serialize Event value")
262	}
263}