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