Skip to main content

tuwunel_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,
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		let members: [JsonMember<_>; _] = [
204			("content", Some(event.content().into())),
205			("sender", Some(event.sender().as_str().into())),
206			("state_key", event.state_key().map(Into::into)),
207			("type", Some(event.event_type().to_string().into())),
208		];
209
210		to_raw_value(&JsonMembers(&members))
211			.map(Self::from_json)
212			.expect("Failed to serialize Event value")
213	}
214}
215
216impl<E: Event> From<Owned<E>> for Raw<HierarchySpaceChildEvent> {
217	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
218}
219
220impl<'a, E: Event> From<Ref<'a, E>> for Raw<HierarchySpaceChildEvent> {
221	fn from(event: Ref<'a, E>) -> Self {
222		let event = event.0;
223		let members: [JsonMember<_>; _] = [
224			("content", Some(event.content().into())),
225			("origin_server_ts", Some(event.origin_server_ts().get().into())),
226			("sender", Some(event.sender().as_str().into())),
227			("state_key", event.state_key().map(Into::into)),
228			("type", Some(event.event_type().to_string().into())),
229		];
230
231		to_raw_value(&JsonMembers(&members))
232			.map(Self::from_json)
233			.expect("Failed to serialize Event value")
234	}
235}
236
237impl<E: Event> From<Owned<E>> for Raw<StateEvent<RoomMemberEventContent>> {
238	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
239}
240
241impl<'a, E: Event> From<Ref<'a, E>> for Raw<StateEvent<RoomMemberEventContent>> {
242	fn from(event: Ref<'a, E>) -> Self {
243		let event = event.0;
244		let members: [JsonMember<_>; _] = [
245			("content", Some(event.content().into())),
246			("event_id", Some(event.event_id().as_str().into())),
247			("origin_server_ts", Some(event.origin_server_ts().get().into())),
248			("redacts", event.redacts().map(|e| e.as_str().into())),
249			("room_id", Some(event.room_id().as_str().into())),
250			("sender", Some(event.sender().as_str().into())),
251			("state_key", event.state_key().map(Into::into)),
252			("type", Some(event.event_type().to_string().into())),
253			("unsigned", event.unsigned().map(Into::into)),
254		];
255
256		to_raw_value(&JsonMembers(&members))
257			.map(Self::from_json)
258			.expect("Failed to serialize Event value")
259	}
260}