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 { 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!"), } } }