This commit is contained in:
parent
00ed1609ba
commit
64ef178558
2 changed files with 44 additions and 5 deletions
|
@ -1,5 +1,9 @@
|
||||||
use anyhow::Result;
|
use anyhow::{Context, Result};
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
|
use std::{
|
||||||
|
io::Write,
|
||||||
|
process::{Command, Stdio},
|
||||||
|
};
|
||||||
|
|
||||||
use crate::util::IntoTableRow;
|
use crate::util::IntoTableRow;
|
||||||
use jm_client_core::util::{self, api, MemeSorting};
|
use jm_client_core::util::{self, api, MemeSorting};
|
||||||
|
@ -9,6 +13,7 @@ pub async fn run(
|
||||||
cat: Option<String>,
|
cat: Option<String>,
|
||||||
user: Option<String>,
|
user: Option<String>,
|
||||||
sorting: Option<MemeSorting>,
|
sorting: Option<MemeSorting>,
|
||||||
|
fzf: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
// This needs to be done so both users, memes and categories will be requested
|
// This needs to be done so both users, memes and categories will be requested
|
||||||
// at once
|
// at once
|
||||||
|
@ -42,11 +47,41 @@ pub async fn run(
|
||||||
|
|
||||||
let mut table = crate::util::list_table();
|
let mut table = crate::util::list_table();
|
||||||
|
|
||||||
for m in memes {
|
for m in memes.iter() {
|
||||||
table.add_row(m.into_table_row());
|
table.add_row(m.into_table_row());
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{}", table.render());
|
let table_str = table.render();
|
||||||
|
|
||||||
|
if fzf {
|
||||||
|
let mut child = Command::new("fzf")
|
||||||
|
.args(&["--delimiter", "\\t", "--with-nth", "2"])
|
||||||
|
.stdout(Stdio::piped())
|
||||||
|
.stdin(Stdio::piped())
|
||||||
|
.spawn()
|
||||||
|
.context("Failed to spawn FZF")?;
|
||||||
|
let stdin = child.stdin.as_mut().context("could not get FZF stdin")?;
|
||||||
|
|
||||||
|
for (idx, line) in table_str.lines().enumerate() {
|
||||||
|
stdin
|
||||||
|
.write(format!("{}\t{}\n", idx, line).as_bytes())
|
||||||
|
.context("Failed to write to FZF")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let out = child.wait_with_output()?;
|
||||||
|
let out_str = String::from_utf8(out.stdout).context("FZF output is invalid UTF-8")?;
|
||||||
|
let idx = out_str
|
||||||
|
.split('\t')
|
||||||
|
.next()
|
||||||
|
.and_then(|s| s.parse::<usize>().ok())
|
||||||
|
.context("Failed to parse FZF output")?;
|
||||||
|
let meme = memes
|
||||||
|
.get(idx)
|
||||||
|
.context("Falied to retrieve meme FZF returned")?;
|
||||||
|
println!("{}", meme.link);
|
||||||
|
} else {
|
||||||
|
println!("{}", table_str);
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ enum Cmd {
|
||||||
cat: bool,
|
cat: bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[structopt(about = "lists all memes")]
|
#[structopt(about = "lists all memes", alias = "l")]
|
||||||
List {
|
List {
|
||||||
#[structopt(long, short, help = "filter by category")]
|
#[structopt(long, short, help = "filter by category")]
|
||||||
category: Option<String>,
|
category: Option<String>,
|
||||||
|
@ -78,6 +78,9 @@ enum Cmd {
|
||||||
help = "how to sort the results. can be id, user, category or link"
|
help = "how to sort the results. can be id, user, category or link"
|
||||||
)]
|
)]
|
||||||
sort: Option<MemeSorting>,
|
sort: Option<MemeSorting>,
|
||||||
|
|
||||||
|
#[structopt(long, short, help = "search memes with FZF")]
|
||||||
|
fzf: bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[structopt(about = "Lists all users")]
|
#[structopt(about = "Lists all users")]
|
||||||
|
@ -114,7 +117,8 @@ async fn main() -> Result<()> {
|
||||||
category,
|
category,
|
||||||
user,
|
user,
|
||||||
sort,
|
sort,
|
||||||
} => commands::list::run(&http, category, user, sort).await?,
|
fzf,
|
||||||
|
} => commands::list::run(&http, category, user, sort, fzf).await?,
|
||||||
Cmd::Users => commands::users::run(&http).await?,
|
Cmd::Users => commands::users::run(&http).await?,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue