use crate::v1::types::{
media::Media, misc::Color, util::truncate::truncate_with_ellipsis, EmbedId,
};
use serde::{Deserialize, Serialize};
use url::Url;
#[cfg(feature = "utoipa")]
use utoipa::ToSchema;
#[cfg(feature = "validator")]
use validator::Validate;
use super::media::MediaRef;
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum EmbedType {
Media,
Link,
#[default]
Custom,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct Embed {
pub id: EmbedId,
#[serde(rename = "type")]
#[serde(default)]
pub ty: EmbedType,
pub url: Option<Url>,
pub canonical_url: Option<Url>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 256))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 256)))]
pub title: Option<String>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 4096))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 4096)))]
pub description: Option<String>,
pub color: Option<Color>,
pub media: Option<Media>,
pub thumbnail: Option<Media>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 256))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 256)))]
pub author_name: Option<String>,
pub author_url: Option<Url>,
pub author_avatar: Option<Media>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 256))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 256)))]
pub site_name: Option<String>,
pub site_avatar: Option<Media>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct EmbedRequest {
pub url: Url,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct EmbedCreate {
pub url: Option<Url>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 256))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 256)))]
pub title: Option<String>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 4096))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 4096)))]
pub description: Option<String>,
pub color: Option<String>,
pub media: Option<MediaRef>,
pub thumbnail: Option<MediaRef>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 256))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 256)))]
pub author_name: Option<String>,
pub author_url: Option<Url>,
pub author_avatar: Option<MediaRef>,
}
impl Embed {
pub fn truncate(self) -> Self {
let title = self
.title
.map(|t| truncate_with_ellipsis(&t, 256).into_owned());
let description = self
.description
.map(|s| truncate_with_ellipsis(&s, 4096).into_owned());
let author_name = self
.author_name
.map(|t| truncate_with_ellipsis(&t, 256).into_owned());
let site_name = self
.site_name
.map(|t| truncate_with_ellipsis(&t, 256).into_owned());
Self {
title,
description,
author_name,
site_name,
url: self.url,
canonical_url: self.canonical_url,
author_url: self.author_url,
media: self.media,
thumbnail: self.thumbnail,
author_avatar: self.author_avatar,
site_avatar: self.site_avatar,
..self
}
}
}