optimize listing (v0.1.2)
continuous-integration/drone/push Build is passing Details

This commit is contained in:
LordMZTE 2020-12-29 14:19:51 +01:00
parent 1d215cb937
commit 8f429357d8
5 changed files with 37 additions and 29 deletions

View File

@ -1,11 +1,4 @@
# First release
# v0.1.2
## cli
- upload
- list
- search
- users
- categories
## tokencracker
- cracks tokens
- optimized listing by not searching on the client but on the server

View File

@ -1,6 +1,6 @@
[package]
name = "cli"
version = "0.1.1"
version = "0.1.2"
authors = ["LordMZTE <lord@mzte.de>"]
edition = "2018"
@ -25,3 +25,5 @@ structopt = "0.3.21"
term-table = "1.3.0"
term_size = "0.3.2"
tokio = { version = "0.2.23", features = ["macros", "fs", "process"] }
url = "2.2.0"

View File

@ -12,7 +12,11 @@ pub async fn run(
// This needs to be done so both users, memes and categories will be requested
// at once
let (memes, ..) = tokio::try_join!(
api::memes(http),
api::memes(
http,
cat.as_ref().map(String::as_ref),
user.as_ref().map(String::as_ref)
),
async {
if let Some(c) = cat.as_ref() {
util::assert_category_exists(http, c).await
@ -29,12 +33,7 @@ pub async fn run(
},
)?;
let memes = memes
.into_iter()
.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));
let mut memes = memes.collect::<Vec<_>>();
let mut memes = memes.iter().collect::<Vec<_>>();
if let Some(s) = sorting {
s.sort_with(&mut memes);

View File

@ -10,9 +10,12 @@ pub async fn run(
user: Option<String>,
cat: Option<String>,
) -> Result<()> {
let memes = api::memes(http);
let (memes, ..) = tokio::try_join!(
memes,
api::memes(
http,
cat.as_ref().map(String::as_ref),
user.as_ref().map(String::as_ref),
),
async {
if let Some(u) = user.as_ref() {
util::assert_user_exists(http, u).await
@ -33,11 +36,6 @@ pub async fn run(
info!("Starting search with query '{}'", query);
let memes = memes
.iter()
.filter(|m| user.as_ref().map(|u| u == &m.user).unwrap_or(true))
.filter(|m| cat.as_ref().map(|u| u == &m.category).unwrap_or(true));
for meme in memes {
let file_name = meme.file_name()?;
if let Some(score) = fuzzy_matcher::clangd::fuzzy_match(file_name, &query) {

View File

@ -30,6 +30,7 @@ pub mod api {
use log::info;
use once_cell::sync::OnceCell;
use reqwest::Client;
use url::Url;
// cached api responses
static CATS: OnceCell<Vec<String>> = OnceCell::new();
@ -48,13 +49,28 @@ pub mod api {
}))
}
pub async fn memes(http: &Client) -> Result<&Vec<Meme>> {
pub async fn memes<'a>(
http: &Client,
cat_filter: Option<&str>,
usr_filter: Option<&str>,
) -> Result<&'a Vec<Meme>> {
Ok(init_once_cell!(MEMES, {
let mut url = Url::options().parse("https://data.tilera.xyz/api/jensmemes/memes")?;
let mut pairs = url.query_pairs_mut();
if let Some(cat) = cat_filter {
pairs.append_pair("category", cat);
}
if let Some(usr) = usr_filter {
pairs.append_pair("user", usr);
}
// drop required in order to move the URL into the request
drop(pairs);
info!("Requesting memes from server");
let res = http
.get("https://data.tilera.xyz/api/jensmemes/memes")
.send()
.await?;
let res = http.get(url).send().await?;
let memes = serde_json::from_slice::<MemesResp>(&res.bytes().await?)?;
memes.memes