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