pub mod categories;
pub mod featured;
pub mod search;
#[doc(hidden)]
pub mod tenor;
pub mod trending;
#[cfg(test)]
mod tests;
pub use codes_iso_639::part_1::LanguageCode;
pub use codes_iso_3166::part_1::CountryCode;
pub use tenor::Tenor;
use std::{fmt, sync::Arc};
use thiserror::Error;
pub type Limit = u8;
pub const DEFAULT_LIMIT: Limit = 20;
pub const MAX_LIMIT: Limit = 50;
#[derive(Error, Debug, Clone)]
pub enum Error {
#[error(transparent)]
Request(Arc<reqwest::Error>),
#[error(transparent)]
Serialization(Arc<serde_json::Error>),
}
impl From<reqwest::Error> for Error {
fn from(value: reqwest::Error) -> Self {
Error::Request(Arc::new(value))
}
}
impl From<serde_json::Error> for Error {
fn from(value: serde_json::Error) -> Self {
Error::Serialization(Arc::new(value))
}
}
#[derive(Debug, Default)]
pub enum ArRange {
#[default]
All,
Wide,
Standard,
}
impl ArRange {
pub(crate) fn to_query_parameter(&self) -> String {
format!(
"&ar_range={}",
match self {
ArRange::All => "all",
ArRange::Wide => "wide",
ArRange::Standard => "standard",
}
)
}
}
#[derive(Debug, Default)]
pub enum ContentFilter {
#[default]
Off,
Low,
Medium,
High,
}
impl ContentFilter {
pub(crate) fn to_query_parameter(&self) -> String {
format!(
"&contentfilter={}",
match self {
ContentFilter::Off => "off",
ContentFilter::Low => "low",
ContentFilter::Medium => "medium",
ContentFilter::High => "high",
}
)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Locale {
language: LanguageCode,
country: CountryCode,
}
impl Locale {
pub fn new(language: LanguageCode, country: CountryCode) -> Self {
Self { language, country }
}
pub(crate) fn to_query_parameter(&self) -> String {
format!(
"&country={}&locate={}",
self.country.to_string().to_uppercase(),
self.to_string()
)
}
}
impl Default for Locale {
fn default() -> Self {
Self {
language: LanguageCode::En,
country: CountryCode::US,
}
}
}
impl fmt::Display for Locale {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}_{}",
self.language.to_string().to_lowercase(),
self.country.to_string().to_uppercase(),
)
}
}
#[derive(Debug)]
pub enum MediaFilter {
Preview,
Gif,
MediumGif,
TinyGif,
NanoGif,
Mp4,
LoopedMp4,
TinyMp4,
NanoMp4,
Webm,
TinyWebm,
NanoWebm,
WebpTransparent,
TinyWebpTransparent,
NanoWebpTransparent,
GifTransparent,
TinyGifTransparent,
NanoGifTransparent,
}
impl MediaFilter {
pub const ALL: &'static [MediaFilter] = &[
MediaFilter::Preview,
MediaFilter::Gif,
MediaFilter::MediumGif,
MediaFilter::TinyGif,
MediaFilter::NanoGif,
MediaFilter::Mp4,
MediaFilter::LoopedMp4,
MediaFilter::TinyMp4,
MediaFilter::NanoMp4,
MediaFilter::Webm,
MediaFilter::TinyWebm,
MediaFilter::NanoWebm,
MediaFilter::WebpTransparent,
MediaFilter::TinyWebpTransparent,
MediaFilter::NanoWebpTransparent,
MediaFilter::GifTransparent,
MediaFilter::TinyGifTransparent,
MediaFilter::NanoGifTransparent,
];
pub const DEFAULT: &'static [MediaFilter] = Self::ALL;
}
impl fmt::Display for MediaFilter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MediaFilter::Preview => write!(f, "preview"),
MediaFilter::Gif => write!(f, "gif"),
MediaFilter::MediumGif => write!(f, "mediumgif"),
MediaFilter::TinyGif => write!(f, "tinygif"),
MediaFilter::NanoGif => write!(f, "nanogif"),
MediaFilter::Mp4 => write!(f, "mp4"),
MediaFilter::LoopedMp4 => write!(f, "loopedmp4"),
MediaFilter::TinyMp4 => write!(f, "tinymp4"),
MediaFilter::NanoMp4 => write!(f, "nanomp4"),
MediaFilter::Webm => write!(f, "webm"),
MediaFilter::TinyWebm => write!(f, "tinywebm"),
MediaFilter::NanoWebm => write!(f, "nanowebm"),
MediaFilter::WebpTransparent => write!(f, "webp_transparent"),
MediaFilter::TinyWebpTransparent => write!(f, "tinywebp_transparent"),
MediaFilter::NanoWebpTransparent => write!(f, "nanowebp_transparent"),
MediaFilter::GifTransparent => write!(f, "gif_transparent"),
MediaFilter::TinyGifTransparent => write!(f, "tinygif_transparent"),
MediaFilter::NanoGifTransparent => write!(f, "nanogif_transparent"),
}
}
}
#[derive(Debug, PartialEq)]
pub enum SearchFilter {
Sticker,
Static,
NonStatic,
}
impl SearchFilter {
pub(crate) fn to_query_parameter(&self) -> String {
format!(
"&searchfilter={}",
match self {
SearchFilter::Sticker => "sticker",
SearchFilter::Static => "sticker,static",
SearchFilter::NonStatic => "sticker,-static",
}
)
}
}