ruma_events/room/
image_pack.rs1use std::collections::{BTreeMap, BTreeSet};
4
5use ruma_common::OwnedMxcUri;
6use ruma_macros::{EventContent, StringEnum};
7use serde::{Deserialize, Serialize};
8
9use crate::{PrivOwnedStr, room::ImageInfo};
10
11#[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)]
15#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
16#[ruma_event(type = "m.room.image_pack", kind = State, state_key_type = String)]
17pub struct RoomImagePackEventContent {
18 pub images: BTreeMap<String, ImagePackImage>,
22
23 #[serde(default, skip_serializing_if = "ImagePackMeta::is_empty")]
28 pub pack: ImagePackMeta,
29}
30
31impl RoomImagePackEventContent {
32 pub fn new(images: BTreeMap<String, ImagePackImage>) -> Self {
34 Self { images, pack: ImagePackMeta::default() }
35 }
36}
37
38#[derive(Clone, Debug, Deserialize, Serialize)]
40#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
41pub struct ImagePackImage {
42 pub url: OwnedMxcUri,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
51 pub body: Option<String>,
52
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub info: Option<ImageInfo>,
56}
57
58impl ImagePackImage {
59 pub fn new(url: OwnedMxcUri) -> Self {
61 Self { url, body: None, info: None }
62 }
63}
64
65#[derive(Clone, Debug, Default, Deserialize, Serialize)]
67#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
68pub struct ImagePackMeta {
69 #[serde(skip_serializing_if = "Option::is_none")]
73 pub display_name: Option<String>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
79 pub avatar_url: Option<OwnedMxcUri>,
80
81 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
85 pub usage: BTreeSet<PackUsage>,
86
87 #[serde(skip_serializing_if = "Option::is_none")]
91 pub attribution: Option<String>,
92}
93
94impl ImagePackMeta {
95 pub fn new() -> Self {
97 Self::default()
98 }
99
100 fn is_empty(&self) -> bool {
102 let Self { display_name, avatar_url, usage, attribution } = self;
103 display_name.is_none() && avatar_url.is_none() && usage.is_empty() && attribution.is_none()
104 }
105}
106
107#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
109#[derive(Clone, StringEnum)]
110#[ruma_enum(rename_all = "snake_case")]
111#[non_exhaustive]
112pub enum PackUsage {
113 Emoticon,
115
116 Sticker,
118
119 #[doc(hidden)]
120 _Custom(PrivOwnedStr),
121}