use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
pub struct Embed {
pub title: Option<String>,
pub r#type: EmbedType,
pub description: Option<String>,
pub url: Option<String>,
pub timestamp: Option<String>,
pub color: Option<i32>,
pub footer: Option<EmbedFooter>,
pub image: Option<EmbedImage>,
pub thumbnail: Option<EmbedThumbnail>,
pub video: Option<EmbedVideo>,
pub provider: Option<EmbedProvider>,
pub author: Option<EmbedAuthor>,
pub fields: Option<Vec<EmbedField>>,
}
#[allow(non_camel_case_types)]
#[derive(Serialize, Deserialize, Debug)]
pub enum EmbedType {
rich,
image,
video,
gifv,
article,
link,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EmbedFooter {
pub text: String,
pub icon_url: Option<String>,
pub proxy_icon_url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EmbedImage {
pub url: Option<String>,
pub proxy_url: Option<String>,
pub height: Option<i32>,
pub width: Option<i32>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EmbedThumbnail {
pub url: Option<String>,
pub proxy_url: Option<String>,
pub height: Option<i32>,
pub width: Option<i32>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EmbedVideo {
pub url: Option<String>,
pub proxy_url: Option<String>,
pub height: Option<i32>,
pub width: Option<i32>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EmbedProvider {
pub name: Option<String>,
pub url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EmbedAuthor {
pub name: Option<String>,
pub url: Option<String>,
pub icon_url: Option<String>,
pub proxy_icon_url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EmbedField {
pub name: String,
pub value: String,
pub inline: Option<bool>,
}
impl Embed {
pub fn new() -> Self {
Self {
title: None,
r#type: EmbedType::rich,
description: None,
url: None,
timestamp: None,
color: None,
footer: None,
image: None,
thumbnail: None,
video: None,
provider: None,
author: None,
fields: None,
}
}
pub fn title(mut self, title: &str) -> Self {
self.title = Some(title.to_string());
self
}
pub fn description(mut self, description: &str) -> Self {
self.description = Some(description.to_string());
self
}
pub fn color(mut self, color: i32) -> Self {
self.color = Some(color);
self
}
pub fn url(mut self, url: &str) -> Self {
self.url = Some(url.to_string());
self
}
pub fn timestamp(mut self, timestamp: &str) -> Self {
self.timestamp = Some(timestamp.to_string());
self
}
pub fn footer(mut self, text: &str, icon_url: Option<&str>) -> Self {
self.footer = Some(EmbedFooter {
text: text.to_string(),
icon_url: icon_url.map(|s| s.to_string()),
proxy_icon_url: None,
});
self
}
pub fn author(mut self, name: &str, url: Option<&str>, icon_url: Option<&str>) -> Self {
self.author = Some(EmbedAuthor {
name: Some(name.to_string()),
url: url.map(|s| s.to_string()),
icon_url: icon_url.map(|s| s.to_string()),
proxy_icon_url: None,
});
self
}
pub fn field(mut self, name: &str, value: &str, inline: bool) -> Self {
let field = EmbedField {
name: name.to_string(),
value: value.to_string(),
inline: Some(inline),
};
match self.fields {
Some(ref mut fields) => fields.push(field),
None => self.fields = Some(vec![field]),
}
self
}
pub fn image(mut self, url: &str) -> Self {
self.image = Some(EmbedImage {
url: Some(url.to_string()),
proxy_url: None,
height: None,
width: None,
});
self
}
pub fn thumbnail(mut self, url: &str) -> Self {
self.thumbnail = Some(EmbedThumbnail {
url: Some(url.to_string()),
proxy_url: None,
height: None,
width: None,
});
self
}
}
impl Default for Embed {
fn default() -> Self {
Self::new()
}
}