Skip to main content

twilight_model/channel/message/embed/
image.rs

1use serde::{Deserialize, Serialize};
2
3use super::EmbedMediaFlags;
4
5#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
6pub struct EmbedImage {
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub height: Option<u64>,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub proxy_url: Option<String>,
11    pub url: String,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub width: Option<u64>,
14    /// Image's [media type].
15    ///
16    /// [media type]: https://en.wikipedia.org/wiki/Media_type
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub content_type: Option<String>,
19    /// A [thumbhash](https://evanw.github.io/thumbhash) placeholder of the image.
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub placeholder: Option<String>,
22    /// Version of the placeholder.
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub placeholder_version: Option<u64>,
25    /// Media flags for this image.
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub flags: Option<EmbedMediaFlags>,
28}
29
30#[cfg(test)]
31mod tests {
32    use super::EmbedImage;
33    use super::EmbedMediaFlags;
34    use serde_test::Token;
35
36    #[test]
37    fn embed_image() {
38        let value = EmbedImage {
39            height: Some(1440),
40            proxy_url: Some("https://cdn.example.com/1-hash.png".to_owned()),
41            url: "https://example.com/1.png".to_owned(),
42            width: Some(2560),
43            content_type: Some("image/png".to_owned()),
44            // Thumbhash of the twilight project logo.
45            placeholder: Some("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg".to_owned()),
46            placeholder_version: Some(1),
47            flags: Some(EmbedMediaFlags::IS_ANIMATED),
48        };
49
50        serde_test::assert_tokens(
51            &value,
52            &[
53                Token::Struct {
54                    name: "EmbedImage",
55                    len: 8,
56                },
57                Token::Str("height"),
58                Token::Some,
59                Token::U64(1440),
60                Token::Str("proxy_url"),
61                Token::Some,
62                Token::Str("https://cdn.example.com/1-hash.png"),
63                Token::Str("url"),
64                Token::Str("https://example.com/1.png"),
65                Token::Str("width"),
66                Token::Some,
67                Token::U64(2560),
68                Token::Str("content_type"),
69                Token::Some,
70                Token::Str("image/png"),
71                Token::Str("placeholder"),
72                Token::Some,
73                Token::Str("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg"),
74                Token::Str("placeholder_version"),
75                Token::Some,
76                Token::U64(1),
77                Token::Str("flags"),
78                Token::Some,
79                Token::U64(32),
80                Token::StructEnd,
81            ],
82        );
83    }
84}