ruma_common/push/condition/
condition_serde.rs1use serde::{Deserialize, Deserializer};
2use serde_json::value::RawValue as RawJsonValue;
3
4use super::PushCondition;
5use crate::{
6 push::_CustomPushCondition,
7 serde::{JsonObject, from_raw_json_value},
8};
9
10impl<'de> Deserialize<'de> for PushCondition {
11 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
12 where
13 D: Deserializer<'de>,
14 {
15 #[derive(Deserialize)]
16 struct ConditionDeHelper {
17 kind: String,
18 }
19
20 let json = Box::<RawJsonValue>::deserialize(deserializer)?;
21 let ConditionDeHelper { kind } = from_raw_json_value(&json)?;
22
23 match kind.as_ref() {
24 "event_match" => from_raw_json_value(&json).map(Self::EventMatch),
25 #[allow(deprecated)]
26 "contains_display_name" => Ok(Self::ContainsDisplayName),
27 "room_member_count" => from_raw_json_value(&json).map(Self::RoomMemberCount),
28 "sender_notification_permission" => {
29 from_raw_json_value(&json).map(Self::SenderNotificationPermission)
30 }
31 #[cfg(feature = "unstable-msc3931")]
32 "org.matrix.msc3931.room_version_supports" => {
33 from_raw_json_value(&json).map(Self::RoomVersionSupports)
34 }
35 "event_property_is" => from_raw_json_value(&json).map(Self::EventPropertyIs),
36 "event_property_contains" => {
37 from_raw_json_value(&json).map(Self::EventPropertyContains)
38 }
39 #[cfg(feature = "unstable-msc4306")]
40 "io.element.msc4306.thread_subscription" => {
41 from_raw_json_value(&json).map(Self::ThreadSubscription)
42 }
43 _ => {
44 let mut data = from_raw_json_value::<JsonObject, _>(&json)?;
45 data.remove("kind");
46
47 Ok(Self::_Custom(_CustomPushCondition { kind, data }))
48 }
49 }
50 }
51}