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, user: Option, sorting: Option, ) -> 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::>(); if let Some(s) = sorting { s.sort_with(&mut memes); } println!( "{}", list_table() .type_header::() .add_rows(memes.into_iter().cloned().map(JMTableEntry)) ); Ok(()) }