58 lines
1.5 KiB
Rust
58 lines
1.5 KiB
Rust
use thiserror::Error;
|
|
|
|
use crate::api::Meme;
|
|
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)),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Error, PartialEq, Eq)]
|
|
#[error("Invalid Meme sorting! Options are id, link, category and user!")]
|
|
pub struct InvalidMemeSortingError;
|
|
|
|
impl FromStr for MemeSorting {
|
|
type Err = InvalidMemeSortingError;
|
|
|
|
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),
|
|
_ => Err(InvalidMemeSortingError),
|
|
}
|
|
}
|
|
}
|