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