53 lines
1.3 KiB
Rust
53 lines
1.3 KiB
Rust
use crate::{
|
|
table::{list_table, JMTableEntry, TableExt},
|
|
util,
|
|
};
|
|
use anyhow::Result;
|
|
use libjens::{api::Meme, util::MemeSorting, JMClient};
|
|
|
|
pub async fn run(
|
|
client: &JMClient,
|
|
cat: Option<String>,
|
|
user: Option<String>,
|
|
sorting: Option<MemeSorting>,
|
|
) -> Result<()> {
|
|
// This needs to be done so both users, memes and categories will be requested
|
|
// at once
|
|
let (memes, ..) = tokio::try_join!(
|
|
async { client.get_memes().await.map_err(|e| e.into()) },
|
|
async {
|
|
if let Some(c) = cat.as_ref() {
|
|
util::assert_category_exists(client, c).await
|
|
} else {
|
|
Ok(())
|
|
}
|
|
},
|
|
async {
|
|
if let Some(u) = user.as_ref() {
|
|
util::assert_user_exists(client, u).await
|
|
} else {
|
|
Ok(())
|
|
}
|
|
},
|
|
)?;
|
|
|
|
let mut memes = memes
|
|
.iter()
|
|
.filter(|m| cat.as_ref().map(|c| &m.category == c).unwrap_or(true))
|
|
.filter(|m| user.as_ref().map(|u| &m.user == u).unwrap_or(true))
|
|
.collect::<Vec<_>>();
|
|
|
|
if let Some(s) = sorting {
|
|
s.sort_with(&mut memes);
|
|
}
|
|
|
|
println!(
|
|
"{}",
|
|
list_table()
|
|
.type_header::<Meme>()
|
|
.add_rows(memes.into_iter().cloned().map(JMTableEntry))
|
|
);
|
|
|
|
Ok(())
|
|
}
|