use mime;
use serde::{Deserialize, Deserializer, Serialize};
use crate::common::serde_via_string;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct HashtagEntity {
#[serde(rename = "indices")]
pub range: (usize, usize),
pub text: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MediaEntity {
pub display_url: String,
pub expanded_url: String,
pub id: u64,
#[serde(rename = "indices")]
pub range: (usize, usize),
pub media_url: String,
pub media_url_https: String,
pub sizes: MediaSizes,
pub source_status_id: Option<u64>,
#[serde(rename = "type")]
pub media_type: MediaType,
pub url: String,
pub video_info: Option<VideoInfo>,
pub ext_alt_text: Option<String>,
}
#[derive(Debug, Copy, Clone, Deserialize, Serialize, PartialEq)]
pub enum MediaType {
#[serde(rename = "photo")]
Photo,
#[serde(rename = "video")]
Video,
#[serde(rename = "animated_gif")]
Gif,
}
#[derive(Debug, Copy, Clone, Deserialize, Serialize)]
pub struct MediaSizes {
pub thumb: MediaSize,
pub small: MediaSize,
pub medium: MediaSize,
pub large: MediaSize,
}
#[derive(Debug, Copy, Clone, Deserialize, Serialize, PartialEq)]
pub enum ResizeMode {
#[serde(rename = "fit")]
Fit,
#[serde(rename = "crop")]
Crop,
}
#[derive(Debug, Copy, Clone, Deserialize, Serialize)]
pub struct MediaSize {
pub w: i32,
pub h: i32,
pub resize: ResizeMode,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct VideoInfo {
pub aspect_ratio: (i32, i32),
pub duration_millis: Option<i32>,
pub variants: Vec<VideoVariant>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct VideoVariant {
pub bitrate: Option<i32>,
#[serde(with = "serde_via_string")]
pub content_type: mime::Mime,
pub url: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UrlEntity {
#[serde(default)]
pub display_url: String,
#[serde(default)]
pub expanded_url: Option<String>,
#[serde(rename = "indices")]
pub range: (usize, usize),
pub url: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MentionEntity {
#[serde(deserialize_with = "nullable_id")] pub id: u64,
#[serde(rename = "indices")]
pub range: (usize, usize),
#[serde(deserialize_with = "nullable_str")] pub name: String,
pub screen_name: String,
}
fn nullable_id<'de, D>(deserializer: D) -> Result<u64, D::Error>
where
D: Deserializer<'de>,
{
let opt = Option::deserialize(deserializer)?;
Ok(opt.unwrap_or_default())
}
fn nullable_str<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let opt = Option::deserialize(deserializer)?;
Ok(opt.unwrap_or_default())
}