1use crate::attachment::Attachment;
2use serde::{Deserialize, Serialize};
3
4#[derive(Deserialize, Debug, Clone)]
6#[serde(tag = "type")]
7pub enum Embed {
8 Website(WebsiteMetadata),
9 Image(Image),
10 Video(Video),
11 Text(Text),
12 None,
13}
14
15#[derive(Serialize, Deserialize, Clone, Debug, Default)]
17pub struct SendableEmbed {
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub icon_url: Option<String>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub url: Option<String>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub title: Option<String>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub description: Option<String>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub media: Option<String>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub colour: Option<String>,
30}
31
32#[derive(Deserialize, Debug, Clone)]
34pub struct Image {
35 pub url: String,
37
38 pub width: isize,
40
41 pub height: isize,
43
44 pub size: ImageSize,
46}
47
48#[derive(Deserialize, Debug, Clone)]
50pub enum ImageSize {
51 Large,
53
54 Preview,
56}
57
58#[derive(Deserialize, Debug, Clone)]
60pub struct Video {
61 pub url: String,
63
64 pub width: isize,
66
67 pub height: isize,
69}
70
71#[derive(Deserialize, Debug, Clone)]
73pub struct Text {
74 pub icon_url: Option<String>,
76
77 pub url: Option<String>,
79
80 pub title: Option<String>,
82
83 pub description: Option<String>,
85
86 pub media: Option<Attachment>,
88
89 pub colour: Option<String>,
91}
92
93#[derive(Deserialize, Debug, Clone)]
95#[serde(tag = "type")]
96pub enum Special {
97 None,
99
100 GIF,
104
105 YouTube {
107 id: String,
108 timestamp: Option<String>,
109 },
110
111 Lightspeed {
113 content_type: LightspeedType,
114 id: String,
115 },
116
117 Twitch {
119 content_type: TwitchType,
120 id: String,
121 },
122 Spotify { content_type: String, id: String },
124
125 Soundcloud,
127
128 Bandcamp {
130 content_type: BandcampType,
131 id: String,
132 },
133}
134
135#[derive(Deserialize, Debug, Clone)]
137pub enum TwitchType {
138 Channel,
139 Video,
140 Clip,
141}
142
143#[derive(Deserialize, Debug, Clone)]
145pub enum LightspeedType {
146 Channel,
147}
148
149#[derive(Deserialize, Debug, Clone)]
151pub enum BandcampType {
152 Album,
153 Track,
154}
155
156#[derive(Deserialize, Debug, Clone)]
158pub struct WebsiteMetadata {
159 pub url: Option<String>,
161
162 pub original_url: Option<String>,
164
165 pub special: Option<Special>,
167
168 pub title: Option<String>,
170
171 pub description: Option<String>,
173
174 pub image: Option<Image>,
176
177 pub video: Option<Video>,
179
180 pub site_name: Option<String>,
182
183 pub icon_url: Option<String>,
185
186 pub colour: Option<String>,
188}