ruma_events/room/
image_pack.rs1use std::collections::{BTreeMap, BTreeSet};
6
7use ruma_common::OwnedMxcUri;
8use ruma_macros::{EventContent, StringEnum};
9use serde::{Deserialize, Serialize};
10
11use crate::{PrivOwnedStr, room::ImageInfo};
12
13#[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)]
19#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
20#[ruma_event(type = "m.room.image_pack", kind = State, state_key_type = String)]
21pub struct RoomImagePackEventContent {
22 pub images: BTreeMap<String, ImagePackImage>,
26
27 #[serde(default, skip_serializing_if = "ImagePackMeta::is_empty")]
32 pub pack: ImagePackMeta,
33}
34
35impl RoomImagePackEventContent {
36 pub fn new(images: BTreeMap<String, ImagePackImage>) -> Self {
38 Self { images, pack: ImagePackMeta::default() }
39 }
40}
41
42#[derive(Clone, Debug, Deserialize, Serialize)]
44#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
45pub struct ImagePackImage {
46 pub url: OwnedMxcUri,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
55 pub body: Option<String>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub info: Option<ImageInfo>,
60}
61
62impl ImagePackImage {
63 pub fn new(url: OwnedMxcUri) -> Self {
65 Self { url, body: None, info: None }
66 }
67}
68
69#[derive(Clone, Debug, Default, Deserialize, Serialize)]
71#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
72pub struct ImagePackMeta {
73 #[serde(skip_serializing_if = "Option::is_none")]
77 pub display_name: Option<String>,
78
79 #[serde(skip_serializing_if = "Option::is_none")]
83 pub avatar_url: Option<OwnedMxcUri>,
84
85 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
89 pub usage: BTreeSet<PackUsage>,
90
91 #[serde(skip_serializing_if = "Option::is_none")]
95 pub attribution: Option<String>,
96}
97
98impl ImagePackMeta {
99 pub fn new() -> Self {
101 Self::default()
102 }
103
104 fn is_empty(&self) -> bool {
106 let Self { display_name, avatar_url, usage, attribution } = self;
107 display_name.is_none() && avatar_url.is_none() && usage.is_empty() && attribution.is_none()
108 }
109}
110
111#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
113#[derive(Clone, StringEnum)]
114#[ruma_enum(rename_all = "snake_case")]
115#[non_exhaustive]
116pub enum PackUsage {
117 Emoticon,
119
120 Sticker,
122
123 #[doc(hidden)]
124 _Custom(PrivOwnedStr),
125}