Skip to content

Commit 6592fc7

Browse files
committed
add basic file searching
1 parent b6f39a8 commit 6592fc7

6 files changed

Lines changed: 57 additions & 7 deletions

File tree

src-tauri/Cargo.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ tauri = { version = "1.3", features = ["shell-open"] }
1717
serde = { version = "1.0", features = ["derive"] }
1818
serde_json = "1.0"
1919
sysinfo = "0.29.2"
20+
walkdir = "2.3.3"
21+
fuzzy-matcher = "*"
2022

2123
[features]
2224
# this feature is used for production builds or when `devPath` points to the filesystem

src-tauri/src/file_explorer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub struct Drive {
1414
letter: String,
1515
}
1616

17-
#[derive(Serialize)]
17+
#[derive(Serialize, Clone)]
1818
pub enum DirectoryChild {
1919
File(String), // String is the path to the file
2020
Directory(String)
Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,47 @@
1+
use std::ops::Deref;
2+
use fuzzy_matcher::clangd::fuzzy_match;
3+
use fuzzy_matcher::FuzzyMatcher;
14
use 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]
410
pub 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
}

src-tauri/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ fn main() {
1212
.invoke_handler(tauri::generate_handler![get_disks, open_directory, search_directory])
1313
.run(tauri::generate_context!())
1414
.expect("error while running tauri application");
15-
}
15+
}

src/components/TopBar/SearchBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export default function SearchBar({ currentDirectoryPath, setSearchResults }: Pr
4040

4141
return (
4242
<div>
43-
<Input value={searchValue} setValue={setSearchValue} placeholder={`Search ${currentPlace || "PC."}`} className="rounded-bl-none rounded-br-none" onSubmit={onSearch} size={InputSize.Large} />
43+
<Input value={searchValue} setValue={setSearchValue} placeholder={`Search ${currentPlace || "PC"}`} className="rounded-bl-none rounded-br-none" onSubmit={onSearch} size={InputSize.Large} />
4444
<SearchFilter filters={searchFilter} setFilters={setSearchFilter} />
4545
</div>
4646
)

0 commit comments

Comments
 (0)