ruma_client_api/sync/sync_events/v3/
response_serde.rs1use 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}