Skip to main content

ruma_events/unsigned/
redacted_because_serde.rs

1use ruma_common::{
2    MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedUserId, serde::from_raw_json_value,
3};
4use serde::{Deserialize, de};
5use serde_json::value::RawValue as RawJsonValue;
6
7use super::{AnyRedactionEvent, CustomRedactionEvent};
8use crate::EventTypeDeHelper;
9
10impl<'de> Deserialize<'de> for AnyRedactionEvent {
11    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
12    where
13        D: de::Deserializer<'de>,
14    {
15        let json = Box::<RawJsonValue>::deserialize(deserializer)?;
16        let EventTypeDeHelper { ev_type, .. } = from_raw_json_value(&json)?;
17
18        match &*ev_type {
19            "m.room.redaction" => from_raw_json_value(&json).map(Self::RoomRedaction),
20            #[cfg(feature = "unstable-msc4293")]
21            "m.room.member" => from_raw_json_value(&json).map(Self::RoomMember),
22            _ => {
23                let CustomRedactionEventDeHelper { event_type, event_id, sender, origin_server_ts } =
24                    from_raw_json_value(&json)?;
25                Ok(Self::_Custom(CustomRedactionEvent {
26                    event_type,
27                    event_id,
28                    sender,
29                    origin_server_ts,
30                }))
31            }
32        }
33    }
34}
35
36#[derive(Deserialize)]
37struct CustomRedactionEventDeHelper {
38    /// The type of the event
39    #[serde(rename = "type")]
40    event_type: Box<str>,
41
42    /// The globally unique event identifier for the user who sent the event.
43    event_id: OwnedEventId,
44
45    /// The fully-qualified ID of the user who sent this event.
46    sender: OwnedUserId,
47
48    /// Timestamp in milliseconds on originating homeserver when this event was sent.
49    origin_server_ts: MilliSecondsSinceUnixEpoch,
50}