atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: crates/matrix-sdk/src/attachment.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
// Copyright 2022 Kévin Commaille
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
// Licensed under the Apache License, Version 2.0 (the "License");
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
// you may not use this file except in compliance with the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
// You may obtain a copy of the License at
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
//     http://www.apache.org/licenses/LICENSE-2.0
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
// Unless required by applicable law or agreed to in writing, software
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
// distributed under the License is distributed on an "AS IS" BASIS,
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
// See the License for the specific language governing permissions and
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
// limitations under the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
//! Types and traits for attachments.
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
use std::time::Duration;
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
use ruma::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
    OwnedTransactionId, UInt, assign,
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
    events::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
        Mentions,
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
        room::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
            ImageInfo, ThumbnailInfo,
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
            message::{AudioInfo, FileInfo, TextMessageEventContent, VideoInfo},
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
        },
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
    },
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
use crate::room::reply::Reply;
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
/// Base metadata about an image.
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
#[derive(Debug, Clone, Default)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
pub struct BaseImageInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
    /// The height of the image in pixels.
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
    pub height: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
    /// The width of the image in pixels.
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
    pub width: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
    /// The file size of the image in bytes.
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
    pub size: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
    /// The [BlurHash](https://blurha.sh/) for this image.
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
    pub blurhash: Option<String>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
    /// Whether this image is animated.
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
    pub is_animated: Option<bool>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
/// Base metadata about a video.
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
#[derive(Debug, Clone, Default)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
pub struct BaseVideoInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
    /// The duration of the video.
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
    pub duration: Option<Duration>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
    /// The height of the video in pixels.
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
    pub height: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
    /// The width of the video in pixels.
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
    pub width: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
    /// The file size of the video in bytes.
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    pub size: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
    /// The [BlurHash](https://blurha.sh/) for this video.
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
    pub blurhash: Option<String>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
/// Base metadata about an audio clip.
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
#[derive(Debug, Clone, Default)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
pub struct BaseAudioInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
    /// The duration of the audio clip.
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
    pub duration: Option<Duration>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
    /// The file size of the audio clip in bytes.
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
    pub size: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
    /// The waveform of the audio clip.
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
    /// Must only include values between 0 and 1.
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
    pub waveform: Option<Vec<f32>>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
/// Base metadata about a file.
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
#[derive(Debug, Clone, Default)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
pub struct BaseFileInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
    /// The size of the file in bytes.
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
    pub size: Option<UInt>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
/// Types of metadata for an attachment.
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
#[derive(Debug)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
pub enum AttachmentInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
    /// The metadata of an image.
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
    Image(BaseImageInfo),
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
    /// The metadata of a video.
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
    Video(BaseVideoInfo),
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
    /// The metadata of an audio clip.
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
    Audio(BaseAudioInfo),
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
    /// The metadata of a file.
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
    File(BaseFileInfo),
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
    /// The metadata of a voice message
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
    Voice(BaseAudioInfo),
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
impl From<AttachmentInfo> for ImageInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
    fn from(info: AttachmentInfo) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
        match info {
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
            AttachmentInfo::Image(info) => assign!(ImageInfo::new(), {
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
                height: info.height,
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
                width: info.width,
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
                size: info.size,
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
                blurhash: info.blurhash,
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
                is_animated: info.is_animated,
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
            }),
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
            _ => ImageInfo::new(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
impl From<AttachmentInfo> for VideoInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
    fn from(info: AttachmentInfo) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
        match info {
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
            AttachmentInfo::Video(info) => assign!(VideoInfo::new(), {
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
                duration: info.duration,
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
                height: info.height,
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
                width: info.width,
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
                size: info.size,
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
                blurhash: info.blurhash,
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
            }),
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
            _ => VideoInfo::new(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
impl From<AttachmentInfo> for AudioInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
    fn from(info: AttachmentInfo) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
        match info {
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
            AttachmentInfo::Audio(info) | AttachmentInfo::Voice(info) => {
7ff8adafe9e4atagen2026-10-22 12:30 UTC131
                assign!(AudioInfo::new(), {
7ff8adafe9e4atagen2026-10-22 12:30 UTC132
                    duration: info.duration,
7ff8adafe9e4atagen2026-10-22 12:30 UTC133
                    size: info.size,
7ff8adafe9e4atagen2026-10-22 12:30 UTC134
                })
7ff8adafe9e4atagen2026-10-22 12:30 UTC135
            }
7ff8adafe9e4atagen2026-10-22 12:30 UTC136
            _ => AudioInfo::new(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC137
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC138
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC139
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC140
7ff8adafe9e4atagen2026-10-22 12:30 UTC141
impl From<AttachmentInfo> for FileInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC142
    fn from(info: AttachmentInfo) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC143
        match info {
7ff8adafe9e4atagen2026-10-22 12:30 UTC144
            AttachmentInfo::File(info) => assign!(FileInfo::new(), {
7ff8adafe9e4atagen2026-10-22 12:30 UTC145
                size: info.size,
7ff8adafe9e4atagen2026-10-22 12:30 UTC146
            }),
7ff8adafe9e4atagen2026-10-22 12:30 UTC147
            _ => FileInfo::new(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC148
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC149
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC150
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC151
7ff8adafe9e4atagen2026-10-22 12:30 UTC152
/// A thumbnail to upload and send for an attachment.
7ff8adafe9e4atagen2026-10-22 12:30 UTC153
#[derive(Debug)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC154
pub struct Thumbnail {
7ff8adafe9e4atagen2026-10-22 12:30 UTC155
    /// The raw bytes of the thumbnail.
7ff8adafe9e4atagen2026-10-22 12:30 UTC156
    pub data: Vec<u8>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC157
    /// The type of the thumbnail, this will be used as the content-type header.
7ff8adafe9e4atagen2026-10-22 12:30 UTC158
    pub content_type: mime::Mime,
7ff8adafe9e4atagen2026-10-22 12:30 UTC159
    /// The height of the thumbnail in pixels.
7ff8adafe9e4atagen2026-10-22 12:30 UTC160
    pub height: UInt,
7ff8adafe9e4atagen2026-10-22 12:30 UTC161
    /// The width of the thumbnail in pixels.
7ff8adafe9e4atagen2026-10-22 12:30 UTC162
    pub width: UInt,
7ff8adafe9e4atagen2026-10-22 12:30 UTC163
    /// The file size of the thumbnail in bytes.
7ff8adafe9e4atagen2026-10-22 12:30 UTC164
    pub size: UInt,
7ff8adafe9e4atagen2026-10-22 12:30 UTC165
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC166
7ff8adafe9e4atagen2026-10-22 12:30 UTC167
impl Thumbnail {
7ff8adafe9e4atagen2026-10-22 12:30 UTC168
    /// Convert this `Thumbnail` into a `(data, content_type, info)` tuple.
7ff8adafe9e4atagen2026-10-22 12:30 UTC169
    pub fn into_parts(self) -> (Vec<u8>, mime::Mime, Box<ThumbnailInfo>) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC170
        let thumbnail_info = assign!(ThumbnailInfo::new(), {
7ff8adafe9e4atagen2026-10-22 12:30 UTC171
            height: Some(self.height),
7ff8adafe9e4atagen2026-10-22 12:30 UTC172
            width: Some(self.width),
7ff8adafe9e4atagen2026-10-22 12:30 UTC173
            size: Some(self.size),
7ff8adafe9e4atagen2026-10-22 12:30 UTC174
            mimetype: Some(self.content_type.to_string())
7ff8adafe9e4atagen2026-10-22 12:30 UTC175
        });
7ff8adafe9e4atagen2026-10-22 12:30 UTC176
        (self.data, self.content_type, Box::new(thumbnail_info))
7ff8adafe9e4atagen2026-10-22 12:30 UTC177
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC178
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC179
7ff8adafe9e4atagen2026-10-22 12:30 UTC180
/// Configuration for sending an attachment.
7ff8adafe9e4atagen2026-10-22 12:30 UTC181
#[derive(Debug, Default)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC182
pub struct AttachmentConfig {
7ff8adafe9e4atagen2026-10-22 12:30 UTC183
    /// A fixed transaction id to be used for sending this attachment.
7ff8adafe9e4atagen2026-10-22 12:30 UTC184
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC185
    /// Otherwise, a random one will be generated.
7ff8adafe9e4atagen2026-10-22 12:30 UTC186
    pub txn_id: Option<OwnedTransactionId>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC187
7ff8adafe9e4atagen2026-10-22 12:30 UTC188
    /// Type-specific metadata about the attachment.
7ff8adafe9e4atagen2026-10-22 12:30 UTC189
    pub info: Option<AttachmentInfo>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC190
7ff8adafe9e4atagen2026-10-22 12:30 UTC191
    /// An optional thumbnail to send with the attachment.
7ff8adafe9e4atagen2026-10-22 12:30 UTC192
    pub thumbnail: Option<Thumbnail>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC193
7ff8adafe9e4atagen2026-10-22 12:30 UTC194
    /// An optional caption for the attachment.
7ff8adafe9e4atagen2026-10-22 12:30 UTC195
    pub caption: Option<TextMessageEventContent>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC196
7ff8adafe9e4atagen2026-10-22 12:30 UTC197
    /// Intentional mentions to be included in the media event.
7ff8adafe9e4atagen2026-10-22 12:30 UTC198
    pub mentions: Option<Mentions>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC199
7ff8adafe9e4atagen2026-10-22 12:30 UTC200
    /// Reply parameters for the attachment (replied-to event and thread-related
7ff8adafe9e4atagen2026-10-22 12:30 UTC201
    /// metadata).
7ff8adafe9e4atagen2026-10-22 12:30 UTC202
    pub reply: Option<Reply>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC203
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC204
7ff8adafe9e4atagen2026-10-22 12:30 UTC205
impl AttachmentConfig {
7ff8adafe9e4atagen2026-10-22 12:30 UTC206
    /// Create a new empty `AttachmentConfig`.
7ff8adafe9e4atagen2026-10-22 12:30 UTC207
    pub fn new() -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC208
        Self::default()
7ff8adafe9e4atagen2026-10-22 12:30 UTC209
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC210
7ff8adafe9e4atagen2026-10-22 12:30 UTC211
    /// Set the thumbnail to send.
7ff8adafe9e4atagen2026-10-22 12:30 UTC212
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC213
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC214
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC215
    /// * `thumbnail` - The thumbnail of the media. If the `content_type` does
7ff8adafe9e4atagen2026-10-22 12:30 UTC216
    ///   not support it (e.g. audio clips), it is ignored.
7ff8adafe9e4atagen2026-10-22 12:30 UTC217
    #[must_use]
7ff8adafe9e4atagen2026-10-22 12:30 UTC218
    pub fn thumbnail(mut self, thumbnail: Option<Thumbnail>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC219
        self.thumbnail = thumbnail;
7ff8adafe9e4atagen2026-10-22 12:30 UTC220
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC221
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC222
7ff8adafe9e4atagen2026-10-22 12:30 UTC223
    /// Set the transaction ID to send.
7ff8adafe9e4atagen2026-10-22 12:30 UTC224
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC225
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC226
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC227
    /// * `txn_id` - A unique ID that can be attached to a `MessageEvent` held
7ff8adafe9e4atagen2026-10-22 12:30 UTC228
    ///   in its unsigned field as `transaction_id`. If not given, one is
7ff8adafe9e4atagen2026-10-22 12:30 UTC229
    ///   created for the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC230
    #[must_use]
7ff8adafe9e4atagen2026-10-22 12:30 UTC231
    pub fn txn_id(mut self, txn_id: OwnedTransactionId) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC232
        self.txn_id = Some(txn_id);
7ff8adafe9e4atagen2026-10-22 12:30 UTC233
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC234
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC235
7ff8adafe9e4atagen2026-10-22 12:30 UTC236
    /// Set the media metadata to send.
7ff8adafe9e4atagen2026-10-22 12:30 UTC237
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC238
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC239
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC240
    /// * `info` - The metadata of the media. If the `AttachmentInfo` type
7ff8adafe9e4atagen2026-10-22 12:30 UTC241
    ///   doesn't match the `content_type`, it is ignored.
7ff8adafe9e4atagen2026-10-22 12:30 UTC242
    #[must_use]
7ff8adafe9e4atagen2026-10-22 12:30 UTC243
    pub fn info(mut self, info: AttachmentInfo) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC244
        self.info = Some(info);
7ff8adafe9e4atagen2026-10-22 12:30 UTC245
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC246
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC247
7ff8adafe9e4atagen2026-10-22 12:30 UTC248
    /// Set the optional caption.
7ff8adafe9e4atagen2026-10-22 12:30 UTC249
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC250
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC251
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC252
    /// * `caption` - The optional caption.
7ff8adafe9e4atagen2026-10-22 12:30 UTC253
    pub fn caption(mut self, caption: Option<TextMessageEventContent>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC254
        self.caption = caption;
7ff8adafe9e4atagen2026-10-22 12:30 UTC255
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC256
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC257
7ff8adafe9e4atagen2026-10-22 12:30 UTC258
    /// Set the mentions of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC259
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC260
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC261
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC262
    /// * `mentions` - The mentions of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC263
    pub fn mentions(mut self, mentions: Option<Mentions>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC264
        self.mentions = mentions;
7ff8adafe9e4atagen2026-10-22 12:30 UTC265
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC266
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC267
7ff8adafe9e4atagen2026-10-22 12:30 UTC268
    /// Set the reply information of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC269
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC270
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC271
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC272
    /// * `reply` - The reply information of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC273
    pub fn reply(mut self, reply: Option<Reply>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC274
        self.reply = reply;
7ff8adafe9e4atagen2026-10-22 12:30 UTC275
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC276
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC277
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC278
7ff8adafe9e4atagen2026-10-22 12:30 UTC279
/// Configuration for sending a gallery.
7ff8adafe9e4atagen2026-10-22 12:30 UTC280
#[cfg(feature = "unstable-msc4274")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC281
#[derive(Debug, Default)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC282
pub struct GalleryConfig {
7ff8adafe9e4atagen2026-10-22 12:30 UTC283
    pub(crate) txn_id: Option<OwnedTransactionId>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC284
    pub(crate) items: Vec<GalleryItemInfo>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC285
    pub(crate) caption: Option<TextMessageEventContent>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC286
    pub(crate) mentions: Option<Mentions>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC287
    pub(crate) reply: Option<Reply>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC288
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC289
7ff8adafe9e4atagen2026-10-22 12:30 UTC290
#[cfg(feature = "unstable-msc4274")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC291
impl GalleryConfig {
7ff8adafe9e4atagen2026-10-22 12:30 UTC292
    /// Create a new empty `GalleryConfig`.
7ff8adafe9e4atagen2026-10-22 12:30 UTC293
    pub fn new() -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC294
        Self::default()
7ff8adafe9e4atagen2026-10-22 12:30 UTC295
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC296
7ff8adafe9e4atagen2026-10-22 12:30 UTC297
    /// Set the transaction ID to send.
7ff8adafe9e4atagen2026-10-22 12:30 UTC298
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC299
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC300
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC301
    /// * `txn_id` - A unique ID that can be attached to a `MessageEvent` held
7ff8adafe9e4atagen2026-10-22 12:30 UTC302
    ///   in its unsigned field as `transaction_id`. If not given, one is
7ff8adafe9e4atagen2026-10-22 12:30 UTC303
    ///   created for the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC304
    #[must_use]
7ff8adafe9e4atagen2026-10-22 12:30 UTC305
    pub fn txn_id(mut self, txn_id: OwnedTransactionId) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC306
        self.txn_id = Some(txn_id);
7ff8adafe9e4atagen2026-10-22 12:30 UTC307
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC308
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC309
7ff8adafe9e4atagen2026-10-22 12:30 UTC310
    /// Adds a media item to the gallery.
7ff8adafe9e4atagen2026-10-22 12:30 UTC311
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC312
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC313
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC314
    /// * `item` - Information about the item to be added.
7ff8adafe9e4atagen2026-10-22 12:30 UTC315
    #[must_use]
7ff8adafe9e4atagen2026-10-22 12:30 UTC316
    pub fn add_item(mut self, item: GalleryItemInfo) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC317
        self.items.push(item);
7ff8adafe9e4atagen2026-10-22 12:30 UTC318
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC319
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC320
7ff8adafe9e4atagen2026-10-22 12:30 UTC321
    /// Set the optional caption.
7ff8adafe9e4atagen2026-10-22 12:30 UTC322
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC323
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC324
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC325
    /// * `caption` - The optional caption.
7ff8adafe9e4atagen2026-10-22 12:30 UTC326
    pub fn caption(mut self, caption: Option<TextMessageEventContent>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC327
        self.caption = caption;
7ff8adafe9e4atagen2026-10-22 12:30 UTC328
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC329
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC330
7ff8adafe9e4atagen2026-10-22 12:30 UTC331
    /// Set the mentions of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC332
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC333
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC334
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC335
    /// * `mentions` - The mentions of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC336
    pub fn mentions(mut self, mentions: Option<Mentions>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC337
        self.mentions = mentions;
7ff8adafe9e4atagen2026-10-22 12:30 UTC338
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC339
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC340
7ff8adafe9e4atagen2026-10-22 12:30 UTC341
    /// Set the reply information of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC342
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC343
    /// # Arguments
7ff8adafe9e4atagen2026-10-22 12:30 UTC344
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC345
    /// * `reply` - The reply information of the message.
7ff8adafe9e4atagen2026-10-22 12:30 UTC346
    pub fn reply(mut self, reply: Option<Reply>) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC347
        self.reply = reply;
7ff8adafe9e4atagen2026-10-22 12:30 UTC348
        self
7ff8adafe9e4atagen2026-10-22 12:30 UTC349
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC350
7ff8adafe9e4atagen2026-10-22 12:30 UTC351
    /// Returns the number of media items in the gallery.
7ff8adafe9e4atagen2026-10-22 12:30 UTC352
    pub fn len(&self) -> usize {
7ff8adafe9e4atagen2026-10-22 12:30 UTC353
        self.items.len()
7ff8adafe9e4atagen2026-10-22 12:30 UTC354
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC355
7ff8adafe9e4atagen2026-10-22 12:30 UTC356
    /// Checks whether the gallery contains any media items or not.
7ff8adafe9e4atagen2026-10-22 12:30 UTC357
    pub fn is_empty(&self) -> bool {
7ff8adafe9e4atagen2026-10-22 12:30 UTC358
        self.items.is_empty()
7ff8adafe9e4atagen2026-10-22 12:30 UTC359
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC360
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC361
7ff8adafe9e4atagen2026-10-22 12:30 UTC362
#[cfg(feature = "unstable-msc4274")]
7ff8adafe9e4atagen2026-10-22 12:30 UTC363
#[derive(Debug)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC364
/// Metadata for a gallery item
7ff8adafe9e4atagen2026-10-22 12:30 UTC365
pub struct GalleryItemInfo {
7ff8adafe9e4atagen2026-10-22 12:30 UTC366
    /// The filename.
7ff8adafe9e4atagen2026-10-22 12:30 UTC367
    pub filename: String,
7ff8adafe9e4atagen2026-10-22 12:30 UTC368
    /// The mime type.
7ff8adafe9e4atagen2026-10-22 12:30 UTC369
    pub content_type: mime::Mime,
7ff8adafe9e4atagen2026-10-22 12:30 UTC370
    /// The binary data.
7ff8adafe9e4atagen2026-10-22 12:30 UTC371
    pub data: Vec<u8>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC372
    /// The attachment info.
7ff8adafe9e4atagen2026-10-22 12:30 UTC373
    pub attachment_info: AttachmentInfo,
7ff8adafe9e4atagen2026-10-22 12:30 UTC374
    /// The caption.
7ff8adafe9e4atagen2026-10-22 12:30 UTC375
    pub caption: Option<TextMessageEventContent>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC376
    /// The thumbnail.
7ff8adafe9e4atagen2026-10-22 12:30 UTC377
    pub thumbnail: Option<Thumbnail>,
7ff8adafe9e4atagen2026-10-22 12:30 UTC378
}