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