jensmemesclient/jm_client_core/src/util.rs

53 lines
1.4 KiB
Rust

use crate::api::Meme;
use anyhow::bail;
use std::str::FromStr;
pub mod consts {
pub const API_ENDPOINT: &str = "https://api.tilera.xyz/jensmemes/v1/";
}
pub enum MemeSorting {
Id,
Link,
Category,
User,
Timestamp,
}
impl MemeSorting {
pub fn sort_with(&self, memes: &mut [&Meme]) {
macro_rules! sort {
($list:ident, $field:ident) => {
$list.sort_by(|a, b| {
a.$field
.to_ascii_lowercase()
.cmp(&b.$field.to_ascii_lowercase())
});
};
}
match self {
Self::Id => sort!(memes, id),
Self::Link => sort!(memes, link),
Self::Category => sort!(memes, category),
Self::User => sort!(memes, user),
Self::Timestamp => memes.sort_by(|a, b| b.timestamp.cmp(&a.timestamp)),
}
}
}
impl FromStr for MemeSorting {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_ref() {
"id" => Ok(Self::Id),
"link" => Ok(Self::Link),
"category" => Ok(Self::Category),
"user" => Ok(Self::User),
"timestamp" => Ok(Self::Timestamp),
_ => bail!("Invalid Meme sorting! options are id, link, category and user!"),
}
}
}