jensmemesclient/cli/src/commands/list.rs

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(())
}