Skip to main content

ruma_common/push/action/
action_serde.rs

1use serde::{Deserialize, Deserializer, Serialize, Serializer, de, ser::SerializeStruct};
2
3use super::{Action, CustomActionData, CustomTweak, HighlightTweakValue, Tweak};
4
5impl<'de> Deserialize<'de> for Action {
6    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
7    where
8        D: Deserializer<'de>,
9    {
10        Self::new(CustomActionData::deserialize(deserializer)?).map_err(de::Error::custom)
11    }
12}
13
14impl Serialize for Action {
15    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer,
18    {
19        match self {
20            Action::Notify => serializer.serialize_str("notify"),
21            #[cfg(feature = "unstable-msc3768")]
22            Action::NotifyInApp => serializer.serialize_str("org.matrix.msc3768.notify_in_app"),
23            Action::SetTweak(kind) => kind.serialize(serializer),
24            Action::_Custom(custom) => custom.serialize(serializer),
25        }
26    }
27}
28
29impl<'de> Deserialize<'de> for Tweak {
30    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
31    where
32        D: Deserializer<'de>,
33    {
34        let CustomTweak { set_tweak, value } = CustomTweak::deserialize(deserializer)?;
35        Self::new(set_tweak, value).map_err(de::Error::custom)
36    }
37}
38
39impl Serialize for Tweak {
40    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
41    where
42        S: Serializer,
43    {
44        match self {
45            Self::Sound(tweak) => {
46                let mut s = serializer.serialize_struct("Tweak", 2)?;
47                s.serialize_field("set_tweak", &"sound")?;
48                s.serialize_field("value", tweak)?;
49                s.end()
50            }
51            Self::Highlight(tweak) => {
52                let is_no_highlight = *tweak == HighlightTweakValue::No;
53                let len = if is_no_highlight { 2 } else { 1 };
54
55                let mut s = serializer.serialize_struct("Tweak", len)?;
56                s.serialize_field("set_tweak", &"highlight")?;
57
58                if is_no_highlight {
59                    s.serialize_field("value", &false)?;
60                }
61
62                s.end()
63            }
64            Self::_Custom(tweak) => tweak.serialize(serializer),
65        }
66    }
67}