ruma_events/
media_preview_config.rs

1//! Types for the [`m.media_preview_config`] event.
2//!
3//! [`m.media_preview_config`]: https://github.com/matrix-org/matrix-spec-proposals/pull/4278
4
5use ruma_macros::StringEnum;
6use serde::{Deserialize, Serialize};
7
8use crate::{macros::EventContent, PrivOwnedStr};
9
10/// The content of an `m.media_preview_config` event.
11#[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    /// The media previews configuration.
16    #[serde(default)]
17    pub media_previews: MediaPreviews,
18
19    /// The invite avatars configuration.
20    #[serde(default)]
21    pub invite_avatars: InviteAvatars,
22}
23
24/// The content of an `io.element.msc4278.media_preview_config` event,
25/// the unstable version of `m.media_preview_config` in global account data.
26#[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/// The configuration that handles if media previews should be shown in the timeline.
33#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, StringEnum, Default)]
34#[ruma_enum(rename_all = "lowercase")]
35#[non_exhaustive]
36pub enum MediaPreviews {
37    /// Media previews should be hidden.
38    Off,
39
40    /// Media previews should be only shown in private rooms.
41    Private,
42
43    /// Media previews should always be shown.
44    #[default]
45    On,
46
47    #[doc(hidden)]
48    _Custom(PrivOwnedStr),
49}
50
51/// The configuration to handle if avatars should be shown in invites.
52#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, StringEnum, Default)]
53#[ruma_enum(rename_all = "lowercase")]
54#[non_exhaustive]
55pub enum InviteAvatars {
56    /// Avatars in invites should be hidden.
57    Off,
58
59    /// Avatars in invites should be shown.
60    #[default]
61    On,
62
63    #[doc(hidden)]
64    _Custom(PrivOwnedStr),
65}
66
67impl MediaPreviewConfigEventContent {
68    /// Create a new [`MediaPreviewConfigEventContent`] with the given values.
69    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}