Skip to main content

ruma_common/push/action/
action_serde.rs

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