twilight_model/channel/message/
snapshot.rs

1use crate::{
2    channel::Attachment,
3    id::{marker::GuildMarker, Id},
4    util::Timestamp,
5};
6
7use super::{Embed, MessageFlags};
8
9use serde::{Deserialize, Serialize};
10
11/// The snap-shot of a message.
12#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
13pub struct MessageSnapshot {
14    /// Subset of fields in the message object.
15    message: MessageSnapshotFields,
16    /// ID of the origin message's guild.
17    #[serde(skip_serializing_if = "Option::is_none")]
18    guild_id: Option<Id<GuildMarker>>,
19}
20
21/// A subset of the fields for a message that has been snap-shotted.
22#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
23pub struct MessageSnapshotFields {
24    /// List of attachments from the message snapshot.
25    pub attachments: Vec<Attachment>,
26    /// Content of the message snapshot.
27    pub content: String,
28    /// When the message was last edited.
29    pub edited_timestamp: Option<Timestamp>,
30    /// List of embeds from the message snapshot.
31    pub embeds: Vec<Embed>,
32    /// Flags of the message.
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub flags: Option<MessageFlags>,
35    /// Timestamp of when the message was created.
36    pub timestamp: Timestamp,
37}
38
39#[cfg(test)]
40mod tests {
41    use super::{MessageSnapshot, MessageSnapshotFields};
42    use crate::{channel::Attachment, id::Id, util::Timestamp};
43    use serde_test::Token;
44
45    #[test]
46    fn test_message_snapshot() {
47        let value = MessageSnapshot {
48            message: MessageSnapshotFields {
49                attachments: vec![Attachment {
50                    content_type: None,
51                    description: None,
52                    duration_secs: None,
53                    ephemeral: false,
54                    filename: "file.jpg".to_owned(),
55                    flags: None,
56                    height: Some(100),
57                    id: Id::new(1),
58                    proxy_url: "https://example.com".to_owned(),
59                    size: 1000,
60                    title: None,
61                    url: "https://example.com".to_owned(),
62                    waveform: None,
63                    width: Some(100),
64                }],
65                content: "test".to_owned(),
66                edited_timestamp: Some(Timestamp::from_secs(1_571_573_184).unwrap()),
67                embeds: Vec::new(),
68                flags: None,
69                timestamp: Timestamp::from_secs(1_571_573_184).unwrap(),
70            },
71            guild_id: Some(Id::new(1)),
72        };
73
74        serde_test::assert_tokens(
75            &value,
76            &[
77                Token::Struct {
78                    name: "MessageSnapshot",
79                    len: 2,
80                },
81                Token::Str("message"),
82                Token::Struct {
83                    name: "MessageSnapshotFields",
84                    len: 5,
85                },
86                Token::Str("attachments"),
87                Token::Seq { len: Some(1) },
88                Token::Struct {
89                    name: "Attachment",
90                    len: 8,
91                },
92                Token::Str("content_type"),
93                Token::None,
94                // Token::Str("ephemeral"),
95                // Token::Bool(false),
96                Token::Str("filename"),
97                Token::Str("file.jpg"),
98                Token::Str("height"),
99                Token::Some,
100                Token::U64(100),
101                Token::Str("id"),
102                Token::NewtypeStruct { name: "Id" },
103                Token::Str("1"),
104                Token::Str("proxy_url"),
105                Token::Str("https://example.com"),
106                Token::Str("size"),
107                Token::U64(1000),
108                Token::Str("url"),
109                Token::Str("https://example.com"),
110                Token::Str("width"),
111                Token::Some,
112                Token::U64(100),
113                Token::StructEnd,
114                Token::SeqEnd,
115                Token::Str("content"),
116                Token::Str("test"),
117                Token::Str("edited_timestamp"),
118                Token::Some,
119                Token::Str("2019-10-20T12:06:24.000000+00:00"),
120                Token::Str("embeds"),
121                Token::Seq { len: Some(0) },
122                Token::SeqEnd,
123                Token::Str("timestamp"),
124                Token::Str("2019-10-20T12:06:24.000000+00:00"),
125                Token::StructEnd,
126                Token::Str("guild_id"),
127                Token::Some,
128                Token::NewtypeStruct { name: "Id" },
129                Token::Str("1"),
130                Token::StructEnd,
131            ],
132        );
133    }
134}