ruma_common/push/action/
action_serde.rs1use 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}