@@ -3,13 +3,13 @@ use std::path::Path;
33use serde:: Deserialize ;
44use yazi_shared:: MIME_DIR ;
55
6- use super :: PluginRule ;
6+ use super :: { Preloader , Previewer } ;
77use crate :: { plugin:: MAX_PRELOADERS , Preset , MERGED_YAZI } ;
88
99#[ derive( Deserialize ) ]
1010pub struct Plugin {
11- pub preloaders : Vec < PluginRule > ,
12- pub previewers : Vec < PluginRule > ,
11+ pub preloaders : Vec < Preloader > ,
12+ pub previewers : Vec < Previewer > ,
1313}
1414
1515impl Default for Plugin {
@@ -21,17 +21,17 @@ impl Default for Plugin {
2121
2222 #[ derive( Deserialize ) ]
2323 struct Shadow {
24- preloaders : Vec < PluginRule > ,
24+ preloaders : Vec < Preloader > ,
2525 #[ serde( default ) ]
26- prepend_preloaders : Vec < PluginRule > ,
26+ prepend_preloaders : Vec < Preloader > ,
2727 #[ serde( default ) ]
28- append_preloaders : Vec < PluginRule > ,
28+ append_preloaders : Vec < Preloader > ,
2929
30- previewers : Vec < PluginRule > ,
30+ previewers : Vec < Previewer > ,
3131 #[ serde( default ) ]
32- prepend_previewers : Vec < PluginRule > ,
32+ prepend_previewers : Vec < Previewer > ,
3333 #[ serde( default ) ]
34- append_previewers : Vec < PluginRule > ,
34+ append_previewers : Vec < Previewer > ,
3535 }
3636
3737 let mut shadow = toml:: from_str :: < Outer > ( & MERGED_YAZI ) . unwrap ( ) . plugin ;
@@ -50,9 +50,6 @@ impl Default for Plugin {
5050 }
5151
5252 for ( i, preloader) in shadow. preloaders . iter_mut ( ) . enumerate ( ) {
53- if preloader. sync {
54- panic ! ( "Preloaders cannot be synchronous" ) ;
55- }
5653 preloader. id = i as u8 ;
5754 }
5855
@@ -66,24 +63,34 @@ impl Plugin {
6663 path : & Path ,
6764 mime : Option < & str > ,
6865 f : impl Fn ( & str ) -> bool + Copy ,
69- ) -> Vec < & PluginRule > {
70- let is_folder = mime == Some ( MIME_DIR ) ;
71- self
72- . preloaders
73- . iter ( )
74- . filter ( |& rule| {
75- rule. cond . as_ref ( ) . and_then ( |c| c. eval ( f) ) != Some ( false )
76- && ( rule. mime . as_ref ( ) . zip ( mime) . map_or ( false , |( p, m) | p. match_mime ( m) )
77- || rule. name . as_ref ( ) . is_some_and ( |p| p. match_path ( path, is_folder) ) )
78- } )
79- . collect ( )
66+ ) -> Vec < & Preloader > {
67+ let is_dir = mime == Some ( MIME_DIR ) ;
68+ let mut preloaders = Vec :: with_capacity ( 1 ) ;
69+
70+ for p in & self . preloaders {
71+ if p. cond . as_ref ( ) . and_then ( |c| c. eval ( f) ) == Some ( false ) {
72+ continue ;
73+ }
74+
75+ if !p. mime . as_ref ( ) . zip ( mime) . map_or ( false , |( p, m) | p. match_mime ( m) )
76+ && !p. name . as_ref ( ) . is_some_and ( |p| p. match_path ( path, is_dir) )
77+ {
78+ continue ;
79+ }
80+
81+ preloaders. push ( p) ;
82+ if !p. next {
83+ break ;
84+ }
85+ }
86+ preloaders
8087 }
8188
82- pub fn previewer ( & self , path : & Path , mime : & str ) -> Option < & PluginRule > {
83- let is_folder = mime == MIME_DIR ;
84- self . previewers . iter ( ) . find ( |& rule | {
85- rule . mime . as_ref ( ) . is_some_and ( |p| p. match_mime ( mime) )
86- || rule . name . as_ref ( ) . is_some_and ( |p| p. match_path ( path, is_folder ) )
89+ pub fn previewer ( & self , path : & Path , mime : & str ) -> Option < & Previewer > {
90+ let is_dir = mime == MIME_DIR ;
91+ self . previewers . iter ( ) . find ( |& p | {
92+ p . mime . as_ref ( ) . is_some_and ( |p| p. match_mime ( mime) )
93+ || p . name . as_ref ( ) . is_some_and ( |p| p. match_path ( path, is_dir ) )
8794 } )
8895 }
8996}
0 commit comments