Skip to main content

ruma_client_api/sync/sync_events/v3/
response_serde.rs

1use std::collections::BTreeMap;
2
3#[cfg(feature = "unstable-msc2654")]
4use js_int::UInt;
5use ruma_common::{OwnedEventId, serde::from_raw_json_value};
6use serde::{Deserialize, Deserializer};
7use serde_json::value::RawValue as RawJsonValue;
8
9#[cfg(feature = "unstable-msc4354")]
10use super::Sticky;
11use super::{
12    Ephemeral, JoinedRoom, LeftRoom, RoomAccountData, RoomSummary, State, StateEvents, Timeline,
13    UnreadNotificationsCount,
14};
15
16#[derive(Debug, Deserialize)]
17struct StateDeHelper {
18    state: Option<StateEvents>,
19    state_after: Option<StateEvents>,
20    #[serde(rename = "org.matrix.msc4222.state_after")]
21    state_after_unstable: Option<StateEvents>,
22}
23
24impl<'de> Deserialize<'de> for State {
25    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26    where
27        D: Deserializer<'de>,
28    {
29        let StateDeHelper { state, state_after, state_after_unstable } =
30            StateDeHelper::deserialize(deserializer)?;
31
32        Ok(state_after
33            .or(state_after_unstable)
34            .map(Self::After)
35            .or_else(|| state.map(Self::Before))
36            .unwrap_or_default())
37    }
38}
39
40#[derive(Debug, Deserialize)]
41struct LeftRoomDeHelper {
42    #[serde(default)]
43    timeline: Timeline,
44    #[serde(default)]
45    account_data: RoomAccountData,
46}
47
48impl<'de> Deserialize<'de> for LeftRoom {
49    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
50    where
51        D: Deserializer<'de>,
52    {
53        let json = Box::<RawJsonValue>::deserialize(deserializer)?;
54
55        let state = from_raw_json_value(&json)?;
56        let LeftRoomDeHelper { timeline, account_data } = from_raw_json_value(&json)?;
57
58        Ok(Self { timeline, state, account_data })
59    }
60}
61
62#[derive(Debug, Deserialize)]
63struct JoinedRoomDeHelper {
64    #[serde(default)]
65    summary: RoomSummary,
66    #[serde(default)]
67    unread_notifications: UnreadNotificationsCount,
68    #[serde(default)]
69    unread_thread_notifications: BTreeMap<OwnedEventId, UnreadNotificationsCount>,
70    #[serde(default)]
71    timeline: Timeline,
72    #[serde(default)]
73    account_data: RoomAccountData,
74    #[serde(default)]
75    ephemeral: Ephemeral,
76    #[cfg(feature = "unstable-msc4354")]
77    #[serde(rename = "msc4354_sticky", default)]
78    sticky: Sticky,
79    #[cfg(feature = "unstable-msc2654")]
80    #[serde(rename = "org.matrix.msc2654.unread_count")]
81    unread_count: Option<UInt>,
82}
83
84impl<'de> Deserialize<'de> for JoinedRoom {
85    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
86    where
87        D: Deserializer<'de>,
88    {
89        let json = Box::<RawJsonValue>::deserialize(deserializer)?;
90
91        let state = from_raw_json_value(&json)?;
92        let JoinedRoomDeHelper {
93            summary,
94            unread_notifications,
95            unread_thread_notifications,
96            timeline,
97            account_data,
98            ephemeral,
99            #[cfg(feature = "unstable-msc4354")]
100            sticky,
101            #[cfg(feature = "unstable-msc2654")]
102            unread_count,
103        } = from_raw_json_value(&json)?;
104
105        Ok(Self {
106            summary,
107            unread_notifications,
108            unread_thread_notifications,
109            timeline,
110            state,
111            account_data,
112            ephemeral,
113            #[cfg(feature = "unstable-msc4354")]
114            sticky,
115            #[cfg(feature = "unstable-msc2654")]
116            unread_count,
117        })
118    }
119}