1+ use std:: ops:: Deref ;
2+ use fuzzy_matcher:: clangd:: fuzzy_match;
3+ use fuzzy_matcher:: FuzzyMatcher ;
14use crate :: file_explorer:: DirectoryChild ;
5+ use walkdir:: WalkDir ;
6+ use crate :: util:: conversions:: ostr_to_string;
7+ use fuzzy_matcher:: skim:: SkimMatcherV2 ;
28
39#[ tauri:: command]
410pub fn search_directory ( query : String , search_directory : String , extension : String , accept_files : bool , accept_directories : bool ) -> Vec < DirectoryChild > {
5- return walk ( query, search_directory, extension, accept_files, accept_directories) ;
6- }
11+ let mut results = Vec :: new ( ) ;
12+ let mut fuzzy_scores = Vec :: new ( ) ;
13+ let matcher = SkimMatcherV2 :: default ( ) ;
714
8- fn walk ( query : String , directory : String , extension : String , accept_files : bool , accept_directories : bool ) -> Vec < DirectoryChild > {
9- Vec :: new ( )
15+ for entry in WalkDir :: new ( search_directory) . into_iter ( ) . flatten ( ) {
16+ let file_name = entry. file_name ( ) . to_string_lossy ( ) ;
17+
18+ if entry. file_type ( ) . is_file ( ) {
19+ if !accept_files { continue }
20+
21+ if extension. len ( ) > 0 && !file_name. ends_with ( extension. as_str ( ) ) { continue }
22+
23+
24+ // Remove extension from file name.
25+ let cleaned_filename = entry. path ( ) . file_stem ( ) . and_then ( |stem| stem. to_str ( ) ) . unwrap_or ( "" ) ;
26+ let score = matcher. fuzzy_match ( cleaned_filename, & query) . unwrap_or ( 0 ) ;
27+ if score < 20 { continue }
28+
29+ fuzzy_scores. push ( score) ;
30+ results. push ( DirectoryChild :: File ( file_name. to_string ( ) ) ) ;
31+
32+ continue
33+ } else if !accept_directories { continue }
34+
35+ let score = matcher. fuzzy_match ( & file_name, & query) . unwrap_or ( 0 ) ;
36+ if score < 40 { continue }
37+
38+ results. push ( DirectoryChild :: Directory ( file_name. to_string ( ) ) ) ;
39+ fuzzy_scores. push ( score) ;
40+ }
41+
42+ let mut tuples: Vec < ( usize , _ ) > = fuzzy_scores. iter ( ) . enumerate ( ) . collect ( ) ;
43+ tuples. sort_by ( |a, b| b. 1 . cmp ( a. 1 ) ) ;
44+ results = tuples. into_iter ( ) . map ( |( index, _) | results[ index] . clone ( ) ) . collect ( ) ;
45+
46+ results
1047}
0 commit comments