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,
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.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.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.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.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		let members: [JsonMember<_>; _] = [
175			("content", Some(event.content().into())),
176			("sender", Some(event.sender().as_str().into())),
177			("state_key", event.state_key().map(Into::into)),
178			("type", Some(event.event_type().to_string().into())),
179		];
180
181		to_raw_value(&JsonMembers(&members))
182			.map(Self::from_json)
183			.expect("Failed to serialize Event value")
184	}
185}
186
187impl<E: Event> From<Owned<E>> for Raw<HierarchySpaceChildEvent> {
188	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
189}
190
191impl<'a, E: Event> From<Ref<'a, E>> for Raw<HierarchySpaceChildEvent> {
192	fn from(event: Ref<'a, E>) -> Self {
193		let event = event.0;
194		let members: [JsonMember<_>; _] = [
195			("content", Some(event.content().into())),
196			("origin_server_ts", Some(event.origin_server_ts().get().into())),
197			("sender", Some(event.sender().as_str().into())),
198			("state_key", event.state_key().map(Into::into)),
199			("type", Some(event.event_type().to_string().into())),
200		];
201
202		to_raw_value(&JsonMembers(&members))
203			.map(Self::from_json)
204			.expect("Failed to serialize Event value")
205	}
206}
207
208impl<E: Event> From<Owned<E>> for Raw<StateEvent<RoomMemberEventContent>> {
209	fn from(event: Owned<E>) -> Self { Ref(&event.0).into() }
210}
211
212impl<'a, E: Event> From<Ref<'a, E>> for Raw<StateEvent<RoomMemberEventContent>> {
213	fn from(event: Ref<'a, E>) -> Self {
214		let event = event.0;
215		let members: [JsonMember<_>; _] = [
216			("content", Some(event.content().into())),
217			("event_id", Some(event.event_id().as_str().into())),
218			("origin_server_ts", Some(event.origin_server_ts().get().into())),
219			("redacts", event.redacts().map(|e| e.as_str().into())),
220			("room_id", Some(event.room_id().as_str().into())),
221			("sender", Some(event.sender().as_str().into())),
222			("state_key", event.state_key().map(Into::into)),
223			("type", Some(event.event_type().to_string().into())),
224			("unsigned", event.unsigned().map(Into::into)),
225		];
226
227		to_raw_value(&JsonMembers(&members))
228			.map(Self::from_json)
229			.expect("Failed to serialize Event value")
230	}
231}