jensmemesclient/cli/src/commands/list.rs

53 lines
1.2 KiB
Rust
Raw Normal View History

2020-12-05 22:20:08 +01:00
use anyhow::Result;
2020-12-05 22:21:00 +01:00
use reqwest::Client;
2020-12-05 22:20:08 +01:00
2020-12-20 20:52:22 +01:00
use crate::util::{self, api, MemeSorting};
2020-12-05 22:20:08 +01:00
2020-12-20 20:52:22 +01:00
pub async fn run(
http: &Client,
cat: Option<String>,
user: Option<String>,
sorting: Option<MemeSorting>,
) -> Result<()> {
2020-12-21 23:06:50 +01:00
// This needs to be done so both users, memes and categories will be requested
// at once
let (memes, ..) = tokio::try_join!(
api::memes(http),
async {
2020-12-21 23:06:50 +01:00
if let Some(c) = cat.as_ref() {
util::assert_category_exists(http, c).await
} else {
Ok(())
}
},
async {
2020-12-21 23:06:50 +01:00
if let Some(u) = user.as_ref() {
util::assert_user_exists(http, u).await
} else {
Ok(())
}
},
)?;
2020-12-05 22:20:08 +01:00
2020-12-18 16:58:53 +01:00
let memes = memes
2020-12-20 20:52:22 +01:00
.into_iter()
2020-12-18 16:58:53 +01:00
.filter(|&m| cat.as_ref().map(|q| &m.category == q).unwrap_or(true))
.filter(|&m| user.as_ref().map(|q| &m.user == q).unwrap_or(true));
2020-12-20 20:52:22 +01:00
let mut memes = memes.collect::<Vec<_>>();
if let Some(s) = sorting {
s.sort_with(&mut memes);
}
2020-12-05 22:20:08 +01:00
let mut table = util::list_table();
2020-12-18 16:58:53 +01:00
2020-12-05 22:20:08 +01:00
for m in memes {
table.add_row(m.into());
}
println!("{}", table.render());
Ok(())
2020-12-05 22:21:00 +01:00
}