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::{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}