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
14pub struct Owned<E: Event>(pub(super) E);
19
20pub 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 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}