use std::fmt::{Display, Formatter};
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use super::error::PostError;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum Extension {
AVIF,
JXL,
JPG,
PNG,
WEBP,
GIF,
WEBM,
MP4,
Ugoira,
Unknown,
}
impl Extension {
pub fn guess_format(s: &str) -> Self {
let uu = Self::from_str(s);
if uu.is_err() {
return Self::Unknown;
}
uu.unwrap()
}
pub const fn is_video(&self) -> bool {
matches!(self, Self::GIF | Self::WEBM | Self::MP4 | Self::Ugoira)
}
}
impl FromStr for Extension {
type Err = PostError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"jpg" | "jpeg" | "jfif" => Ok(Self::JPG),
"png" | "apng" => Ok(Self::PNG),
"webp" => Ok(Self::WEBP),
"webm" => Ok(Self::WEBM),
"mp4" => Ok(Self::MP4),
"gif" => Ok(Self::GIF),
"zip" => Ok(Self::Ugoira),
"jxl" => Ok(Self::JXL),
"avif" => Ok(Self::AVIF),
_ => Err(PostError::UnknownExtension {
message: s.to_string(),
}),
}
}
}
impl Display for Extension {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::JPG => write!(f, "jpg"),
Self::PNG => write!(f, "png"),
Self::WEBP => write!(f, "webp"),
Self::GIF => write!(f, "gif"),
Self::WEBM => write!(f, "webm"),
Self::MP4 => write!(f, "mp4"),
Self::Ugoira => write!(f, "zip"),
Self::Unknown => write!(f, "bin"),
Self::AVIF => write!(f, "avif"),
Self::JXL => write!(f, "jxl"),
}
}
}