use chrono::{DateTime, Utc};
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct Embed {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default, rename = "type", skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timestamp: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub color: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub footer: Option<EmbedFooter>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image: Option<EmbedImage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<EmbedThumbnail>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub video: Option<EmbedVideo>,
#[serde(default)]
pub provider: Option<EmbedProvider>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub author: Option<EmbedAuthor>,
#[serde(default)]
pub fields: Vec<EmbedField>
}
impl Embed {
pub fn new() -> Self {
Embed::default()
}
pub fn set_title(mut self, text: impl Into<String>) -> Self {
self.title = Some(text.into());
self
}
pub fn set_description(mut self, text: impl Into<String>) -> Self {
self.description = Some(text.into());
self
}
pub fn set_color(mut self, code: i32) -> Self {
self.color = Some(code);
self
}
pub fn add_field<F: FnOnce(EmbedField) -> EmbedField>(mut self, builder: F) -> Self {
let new_field = builder(EmbedField::default());
self.fields.push(new_field);
self
}
pub fn set_author<F>(mut self, author: F) -> Self
where F: FnOnce(EmbedAuthor) -> EmbedAuthor
{
self.author = Some(author(EmbedAuthor::default()));
self
}
pub fn set_footer<F>(mut self, footer: F) -> Self
where F: FnOnce(EmbedFooter) -> EmbedFooter
{
self.footer = Some(footer(EmbedFooter::default()));
self
}
pub fn set_thumbnail<T>(mut self, thumb: T) -> Self
where T: FnOnce(EmbedThumbnail) -> EmbedThumbnail
{
self.thumbnail = Some(thumb(EmbedThumbnail::default()));
self
}
pub fn set_image<F>(mut self, img: F) -> Self
where F: FnOnce(EmbedImage) -> EmbedImage
{
self.image = Some(img(EmbedImage::default()));
self
}
pub fn set_current_timestamp(mut self) -> Self {
self.timestamp = Some(chrono::Utc::now());
self
}
pub fn set_timestamp(mut self, time: DateTime<Utc>) -> Self {
self.timestamp = Some(time);
self
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedFooter {
pub text: String,
#[serde(default)]
pub icon_url: String,
#[serde(default)]
pub proxy_icon_url: String
}
impl EmbedFooter {
pub fn set_text(mut self, txt: impl Into<String>) -> Self {
self.text = txt.into();
self
}
pub fn set_icon_url(mut self, url: impl Into<String>) -> Self {
self.icon_url = url.into();
self
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedImage {
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub proxy_url: Option<String>,
#[serde(default)]
pub height: Option<i32>,
#[serde(default)]
pub width: Option<i32>
}
impl EmbedImage {
pub fn set_url(mut self, url: impl Into<String>) -> Self {
self.url = Some(url.into());
self
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedThumbnail {
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub proxy_url: Option<String>,
#[serde(default)]
pub height: Option<i32>,
#[serde(default)]
pub width: Option<i32>
}
impl EmbedThumbnail {
pub fn set_url(mut self, url: impl Into<String>) -> Self {
self.url = Some(url.into());
self
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedVideo {
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub height: Option<i32>,
#[serde(default)]
pub width: Option<i32>
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedProvider {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub url: Option<String>
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedAuthor {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub icon_url: Option<String>,
#[serde(default)]
pub proxy_icon_url: Option<String>
}
impl EmbedAuthor {
pub fn set_name(mut self, name: impl Into<String>) -> Self {
self.name = Some(name.into());
self
}
pub fn set_url(mut self, url: impl Into<String>) -> Self {
self.url = Some(url.into());
self
}
pub fn set_icon_url(mut self, url: impl Into<String>) -> Self {
self.icon_url = Some(url.into());
self
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct EmbedField {
pub name: String,
pub value: String,
#[serde(default)]
pub inline: Option<bool>
}
impl EmbedField {
pub fn set_name(mut self, name: impl Into<String>) -> Self {
self.name = name.into();
self
}
pub fn set_value(mut self, val: impl Into<String>) -> Self {
self.value = val.into();
self
}
pub fn set_inline(mut self, inline: bool) -> Self {
self.inline = Some(inline);
self
}
}