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}