1- use std:: { fmt :: Display , mem, time:: Duration } ;
1+ use std:: { mem, time:: Duration } ;
22
3- use anyhow:: bail;
43use tokio:: pin;
54use tokio_stream:: { wrappers:: UnboundedReceiverStream , StreamExt } ;
5+ use tracing:: error;
66use yazi_config:: popup:: InputCfg ;
77use yazi_plugin:: external;
8- use yazi_proxy:: { AppProxy , InputProxy , ManagerProxy , TabProxy } ;
9- use yazi_shared:: { event :: Cmd , fs:: FilesOp , render } ;
8+ use yazi_proxy:: { options :: { SearchOpt , SearchOptVia } , AppProxy , InputProxy , ManagerProxy , TabProxy } ;
9+ use yazi_shared:: fs:: FilesOp ;
1010
1111use crate :: tab:: Tab ;
1212
13- #[ derive( PartialEq , Eq ) ]
14- pub enum OptType {
15- None ,
16- Rg ,
17- Fd ,
18- }
13+ impl Tab {
14+ pub fn search ( & mut self , opt : impl TryInto < SearchOpt > ) {
15+ let Ok ( mut opt) = opt. try_into ( ) else {
16+ return AppProxy :: notify_error ( "Invalid `search` option" , "Failed to parse search option" ) ;
17+ } ;
1918
20- impl From < String > for OptType {
21- fn from ( value : String ) -> Self {
22- match value. as_str ( ) {
23- "rg" => Self :: Rg ,
24- "fd" => Self :: Fd ,
25- _ => Self :: None ,
19+ if opt. via == SearchOptVia :: None {
20+ return self . search_stop ( ) ;
2621 }
27- }
28- }
29-
30- impl Display for OptType {
31- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
32- f. write_str ( match self {
33- Self :: Rg => "rg" ,
34- Self :: Fd => "fd" ,
35- Self :: None => "none" ,
36- } )
37- }
38- }
3922
40- pub struct Opt {
41- pub type_ : OptType ,
42- pub args : Vec < String > ,
43- }
23+ if let Some ( handle) = self . search . take ( ) {
24+ handle. abort ( ) ;
25+ }
4426
45- impl TryFrom < Cmd > for Opt {
46- type Error = ( ) ;
27+ tokio:: spawn ( async move {
28+ let mut input =
29+ InputProxy :: show ( InputCfg :: search ( & opt. via . to_string ( ) ) . with_value ( opt. subject ) ) ;
4730
48- fn try_from ( mut c : Cmd ) -> Result < Self , Self :: Error > {
49- Ok ( Self {
50- type_ : c . take_first_str ( ) . unwrap_or_default ( ) . into ( ) ,
51- args : shell_words :: split ( c . str ( "args" ) . unwrap_or_default ( ) ) . map_err ( |_| ( ) ) ? ,
52- } )
31+ if let Some ( Ok ( subject ) ) = input . recv ( ) . await {
32+ opt . subject = subject ;
33+ TabProxy :: search_do ( opt ) ;
34+ }
35+ } ) ;
5336 }
54- }
5537
56- impl Tab {
57- pub fn search ( & mut self , opt : impl TryInto < Opt > ) {
38+ pub fn search_do ( & mut self , opt : impl TryInto < SearchOpt > ) {
5839 let Ok ( opt) = opt. try_into ( ) else {
59- return AppProxy :: notify_error ( "Invalid `search` option" , " Failed to parse search option") ;
40+ return error ! ( " Failed to parse search option for `search_do` ") ;
6041 } ;
6142
62- if opt. type_ == OptType :: None {
63- return self . search_stop ( ) ;
64- }
65-
6643 if let Some ( handle) = self . search . take ( ) {
6744 handle. abort ( ) ;
6845 }
@@ -71,14 +48,21 @@ impl Tab {
7148 let hidden = self . conf . show_hidden ;
7249
7350 self . search = Some ( tokio:: spawn ( async move {
74- let mut input = InputProxy :: show ( InputCfg :: search ( & opt. type_ . to_string ( ) ) ) ;
75- let Some ( Ok ( subject) ) = input. recv ( ) . await else { bail ! ( "" ) } ;
76-
77- cwd = cwd. into_search ( subject. clone ( ) ) ;
78- let rx = if opt. type_ == OptType :: Rg {
79- external:: rg ( external:: RgOpt { cwd : cwd. clone ( ) , hidden, subject, args : opt. args } )
51+ cwd = cwd. into_search ( opt. subject . clone ( ) ) ;
52+ let rx = if opt. via == SearchOptVia :: Rg {
53+ external:: rg ( external:: RgOpt {
54+ cwd : cwd. clone ( ) ,
55+ hidden,
56+ subject : opt. subject ,
57+ args : opt. args ,
58+ } )
8059 } else {
81- external:: fd ( external:: FdOpt { cwd : cwd. clone ( ) , hidden, subject, args : opt. args } )
60+ external:: fd ( external:: FdOpt {
61+ cwd : cwd. clone ( ) ,
62+ hidden,
63+ subject : opt. subject ,
64+ args : opt. args ,
65+ } )
8266 } ?;
8367
8468 let rx = UnboundedReceiverStream :: new ( rx) . chunks_timeout ( 1000 , Duration :: from_millis ( 300 ) ) ;
@@ -89,10 +73,9 @@ impl Tab {
8973 FilesOp :: Part ( cwd. clone ( ) , chunk, ticket) . emit ( ) ;
9074 }
9175 FilesOp :: Done ( cwd, None , ticket) . emit ( ) ;
76+
9277 Ok ( ( ) )
9378 } ) ) ;
94-
95- render ! ( ) ;
9679 }
9780
9881 pub ( super ) fn search_stop ( & mut self ) {
0 commit comments