titanium_model/
create_message.rs

1use crate::{Component, Embed};
2
3use crate::TitanString;
4use serde::{Deserialize, Serialize};
5
6/// Payload to create a message.
7#[derive(Debug, Clone, Serialize, Deserialize, Default)]
8pub struct CreateMessage<'a> {
9    /// Message content.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub content: Option<TitanString<'a>>,
12
13    /// Pass true if sending a TTS message.
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub tts: Option<bool>,
16
17    /// Embeds to include.
18    #[serde(skip_serializing_if = "Option::is_none", borrow)]
19    pub embeds: Option<Vec<Embed<'a>>>,
20
21    /// Components to include.
22    #[serde(skip_serializing_if = "Option::is_none", borrow)]
23    pub components: Option<Vec<Component<'a>>>,
24
25    /// Message flags (SUPPRESS_EMBEDS, SUPPRESS_NOTIFICATIONS).
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub flags: Option<u64>,
28
29    /// Message reference (reply).
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub message_reference: Option<crate::MessageReference>,
32
33    /// Files to upload (not serialized to JSON, used by HTTP client).
34    #[serde(skip)]
35    pub files: Vec<crate::file::FileUpload>,
36}
37
38impl<'a> CreateMessage<'a> {
39    /// Create a simple text message.
40    pub fn new(content: impl Into<String>) -> Self {
41        Self {
42            content: Some(content.into().into()),
43            ..Default::default()
44        }
45    }
46
47    /// Add an embed.
48    pub fn embed(mut self, embed: Embed<'a>) -> Self {
49        if let Some(embeds) = &mut self.embeds {
50            embeds.push(embed);
51        } else {
52            self.embeds = Some(vec![embed]);
53        }
54        self
55    }
56
57    /// Add a component.
58    pub fn component(mut self, component: Component<'a>) -> Self {
59        if let Some(components) = &mut self.components {
60            components.push(component);
61        } else {
62            self.components = Some(vec![component]);
63        }
64        self
65    }
66}