use crate::models::attachment::Attachment;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Debug, Clone, Serialize)]
#[serde(tag = "type")]
pub enum Embed {
Website(WebsiteMetadata),
Image(Image),
Video(Video),
Text(Text),
None,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedCreate {
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub media: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub colour: Option<String>,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub struct Image {
pub url: String,
pub width: isize,
pub height: isize,
pub size: ImageSize,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub enum ImageSize {
Large,
Preview,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub struct Video {
pub url: String,
pub width: isize,
pub height: isize,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub struct Text {
pub icon_url: Option<String>,
pub url: Option<String>,
pub title: Option<String>,
pub description: Option<String>,
pub media: Option<Attachment>,
pub colour: Option<String>,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
#[serde(tag = "type")]
pub enum Special {
None,
GIF,
YouTube {
id: String,
timestamp: Option<String>,
},
Lightspeed {
content_type: LightspeedType,
id: String,
},
Twitch {
content_type: TwitchType,
id: String,
},
Spotify { content_type: String, id: String },
Soundcloud,
Bandcamp {
content_type: BandcampType,
id: String,
},
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub enum TwitchType {
Channel,
Video,
Clip,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub enum LightspeedType {
Channel,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub enum BandcampType {
Album,
Track,
}
#[derive(Deserialize, Debug, Clone, Serialize)]
pub struct WebsiteMetadata {
pub url: Option<String>,
pub original_url: Option<String>,
pub special: Option<Special>,
pub title: Option<String>,
pub description: Option<String>,
pub image: Option<Image>,
pub video: Option<Video>,
pub site_name: Option<String>,
pub icon_url: Option<String>,
pub colour: Option<String>,
}