ruma_events/
media_preview_config.rs1use ruma_macros::StringEnum;
6use serde::{Deserialize, Serialize};
7
8use crate::{macros::EventContent, PrivOwnedStr};
9
10#[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)]
12#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
13#[ruma_event(type = "m.media_preview_config", kind = GlobalAccountData)]
14pub struct MediaPreviewConfigEventContent {
15 #[serde(default)]
17 pub media_previews: MediaPreviews,
18
19 #[serde(default)]
21 pub invite_avatars: InviteAvatars,
22}
23
24#[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)]
27#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
28#[ruma_event(type = "io.element.msc4278.media_preview_config", kind = GlobalAccountData)]
29#[serde(transparent)]
30pub struct UnstableMediaPreviewConfigEventContent(pub MediaPreviewConfigEventContent);
31
32#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, StringEnum, Default)]
34#[ruma_enum(rename_all = "lowercase")]
35#[non_exhaustive]
36pub enum MediaPreviews {
37 Off,
39
40 Private,
42
43 #[default]
45 On,
46
47 #[doc(hidden)]
48 _Custom(PrivOwnedStr),
49}
50
51#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, StringEnum, Default)]
53#[ruma_enum(rename_all = "lowercase")]
54#[non_exhaustive]
55pub enum InviteAvatars {
56 Off,
58
59 #[default]
61 On,
62
63 #[doc(hidden)]
64 _Custom(PrivOwnedStr),
65}
66
67impl MediaPreviewConfigEventContent {
68 pub fn new(media_previews: MediaPreviews, invite_avatars: InviteAvatars) -> Self {
70 Self { media_previews, invite_avatars }
71 }
72}
73
74impl std::ops::Deref for UnstableMediaPreviewConfigEventContent {
75 type Target = MediaPreviewConfigEventContent;
76
77 fn deref(&self) -> &Self::Target {
78 &self.0
79 }
80}
81
82impl From<MediaPreviewConfigEventContent> for UnstableMediaPreviewConfigEventContent {
83 fn from(value: MediaPreviewConfigEventContent) -> Self {
84 Self(value)
85 }
86}
87
88impl From<UnstableMediaPreviewConfigEventContent> for MediaPreviewConfigEventContent {
89 fn from(value: UnstableMediaPreviewConfigEventContent) -> Self {
90 value.0
91 }
92}
93
94#[cfg(all(test, feature = "unstable-msc4278"))]
95mod tests {
96 use assert_matches2::assert_matches;
97 use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
98
99 use super::{MediaPreviewConfigEventContent, UnstableMediaPreviewConfigEventContent};
100 use crate::{
101 media_preview_config::{InviteAvatars, MediaPreviews},
102 AnyGlobalAccountDataEvent, GlobalAccountDataEvent,
103 };
104
105 #[test]
106 fn deserialize() {
107 let raw_unstable_media_preview_config = json!({
108 "type": "io.element.msc4278.media_preview_config",
109 "content": {
110 "media_previews": "private",
111 "invite_avatars": "off",
112 },
113 });
114 let unstable_media_preview_config_data =
115 from_json_value::<AnyGlobalAccountDataEvent>(raw_unstable_media_preview_config)
116 .unwrap();
117 assert_matches!(
118 unstable_media_preview_config_data,
119 AnyGlobalAccountDataEvent::UnstableMediaPreviewConfig(unstable_media_preview_config)
120 );
121 assert_eq!(unstable_media_preview_config.content.media_previews, MediaPreviews::Private);
122 assert_eq!(unstable_media_preview_config.content.invite_avatars, InviteAvatars::Off);
123
124 let raw_media_preview_config = json!({
125 "type": "m.media_preview_config",
126 "content": {
127 "media_previews": "on",
128 "invite_avatars": "on",
129 },
130 });
131 let media_preview_config_data =
132 from_json_value::<AnyGlobalAccountDataEvent>(raw_media_preview_config).unwrap();
133 assert_matches!(
134 media_preview_config_data,
135 AnyGlobalAccountDataEvent::MediaPreviewConfig(media_preview_config)
136 );
137 assert_eq!(media_preview_config.content.media_previews, MediaPreviews::On);
138 assert_eq!(media_preview_config.content.invite_avatars, InviteAvatars::On);
139 }
140
141 #[test]
142 fn serialize() {
143 let unstable_media_preview_config = UnstableMediaPreviewConfigEventContent(
144 MediaPreviewConfigEventContent::new(MediaPreviews::Off, InviteAvatars::On),
145 );
146 let unstable_media_preview_config_account_data =
147 GlobalAccountDataEvent { content: unstable_media_preview_config };
148 assert_eq!(
149 to_json_value(unstable_media_preview_config_account_data).unwrap(),
150 json!({
151 "type": "io.element.msc4278.media_preview_config",
152 "content": {
153 "media_previews": "off",
154 "invite_avatars": "on",
155 },
156 })
157 );
158
159 let media_preview_config =
160 MediaPreviewConfigEventContent::new(MediaPreviews::On, InviteAvatars::Off);
161 let media_preview_config_account_data =
162 GlobalAccountDataEvent { content: media_preview_config };
163 assert_eq!(
164 to_json_value(media_preview_config_account_data).unwrap(),
165 json!({
166 "type": "m.media_preview_config",
167 "content": {
168 "media_previews": "on",
169 "invite_avatars": "off",
170 },
171 })
172 );
173 }
174}