refactor: move rga to logic to external::rga

This commit is contained in:
paperbenni 2025-02-23 15:25:24 +01:00
parent bcbff4e884
commit 5c905a8c29
4 changed files with 53 additions and 11 deletions

View file

@ -48,21 +48,26 @@ impl Tab {
let hidden = self.pref.show_hidden; let hidden = self.pref.show_hidden;
self.search = Some(tokio::spawn(async move { self.search = Some(tokio::spawn(async move {
let rx = if opt.via == SearchOptVia::Rg || opt.via == SearchOptVia::Rga { let rx = match opt.via {
external::rg(external::RgOpt { SearchOptVia::Rg => external::rg(external::RgOpt {
rga: SearchOptVia::Rga == opt.via,
cwd: cwd.clone(), cwd: cwd.clone(),
hidden, hidden,
subject: opt.subject.into_owned(), subject: opt.subject.into_owned(),
args: opt.args, args: opt.args,
}) }),
} else { SearchOptVia::Rga => external::rga(external::RgaOpt {
external::fd(external::FdOpt {
cwd: cwd.clone(), cwd: cwd.clone(),
hidden, hidden,
subject: opt.subject.into_owned(), subject: opt.subject.into_owned(),
args: opt.args, args: opt.args,
}) }),
SearchOptVia::Fd => external::fd(external::FdOpt {
cwd: cwd.clone(),
hidden,
subject: opt.subject.into_owned(),
args: opt.args,
}),
SearchOptVia::None => Result::Err(anyhow::anyhow!("Invalid `search` option")),
}?; }?;
let rx = UnboundedReceiverStream::new(rx).chunks_timeout(5000, Duration::from_millis(500)); let rx = UnboundedReceiverStream::new(rx).chunks_timeout(5000, Duration::from_millis(500));

View file

@ -1 +1 @@
yazi_macro::mod_flat!(fd highlighter rg); yazi_macro::mod_flat!(fd highlighter rg rga);

View file

@ -7,15 +7,13 @@ use yazi_shared::url::Url;
pub struct RgOpt { pub struct RgOpt {
pub cwd: Url, pub cwd: Url,
pub rga: bool,
pub hidden: bool, pub hidden: bool,
pub subject: String, pub subject: String,
pub args: Vec<String>, pub args: Vec<String>,
} }
pub fn rg(opt: RgOpt) -> Result<UnboundedReceiver<File>> { pub fn rg(opt: RgOpt) -> Result<UnboundedReceiver<File>> {
let commandname = if opt.rga { "rga" } else { "rg" }; let mut child = Command::new("rg")
let mut child = Command::new(commandname)
.args(["--color=never", "--files-with-matches", "--smart-case"]) .args(["--color=never", "--files-with-matches", "--smart-case"])
.arg(if opt.hidden { "--hidden" } else { "--no-hidden" }) .arg(if opt.hidden { "--hidden" } else { "--no-hidden" })
.args(opt.args) .args(opt.args)

39
yazi-plugin/src/external/rga.rs vendored Normal file
View file

@ -0,0 +1,39 @@
use std::process::Stdio;
use anyhow::Result;
use tokio::{io::{AsyncBufReadExt, BufReader}, process::Command, sync::mpsc::{self, UnboundedReceiver}};
use yazi_fs::File;
use yazi_shared::url::Url;
pub struct RgaOpt {
pub cwd: Url,
pub hidden: bool,
pub subject: String,
pub args: Vec<String>,
}
pub fn rga(opt: RgaOpt) -> Result<UnboundedReceiver<File>> {
let mut child = Command::new("rga")
.args(["--color=never", "--files-with-matches", "--smart-case"])
.arg(if opt.hidden { "--hidden" } else { "--no-hidden" })
.args(opt.args)
.arg(opt.subject)
.arg(&opt.cwd)
.kill_on_drop(true)
.stdout(Stdio::piped())
.stderr(Stdio::null())
.spawn()?;
let mut it = BufReader::new(child.stdout.take().unwrap()).lines();
let (tx, rx) = mpsc::unbounded_channel();
tokio::spawn(async move {
while let Ok(Some(line)) = it.next_line().await {
if let Ok(file) = File::from(opt.cwd.join(line)).await {
tx.send(file).ok();
}
}
child.wait().await.ok();
});
Ok(rx)
}