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