Skip to main content

ruma_common/push/condition/
condition_serde.rs

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