twilight_model/channel/message/
snapshot.rs1use 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#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
13pub struct MessageSnapshot {
14 message: MessageSnapshotFields,
16 #[serde(skip_serializing_if = "Option::is_none")]
18 guild_id: Option<Id<GuildMarker>>,
19}
20
21#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
23pub struct MessageSnapshotFields {
24 pub attachments: Vec<Attachment>,
26 pub content: String,
28 pub edited_timestamp: Option<Timestamp>,
30 pub embeds: Vec<Embed>,
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub flags: Option<MessageFlags>,
35 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("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}