summaryrefslogtreecommitdiffstats
path: root/src/utils/mod.rs
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2025-01-23 17:36:38 +0800
committerGitHub <noreply@github.com>2025-01-23 17:36:38 +0800
commitc2d995b9e3ac7e3bbdb8b47531b865afcb074f12 (patch)
tree98bedcd19db46ec8ee66b5edc9b4a7d0c464a066 /src/utils/mod.rs
parent7567478754bfbc4b103b692c6b1574f80a8b453f (diff)
downloadaichat-c2d995b9e3ac7e3bbdb8b47531b865afcb074f12.tar.gz
refactor: fuzzy filter REPL autocompletions (#1120)
Diffstat (limited to 'src/utils/mod.rs')
-rw-r--r--src/utils/mod.rs16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/utils/mod.rs b/src/utils/mod.rs
index f4b98c1..7aa1801 100644
--- a/src/utils/mod.rs
+++ b/src/utils/mod.rs
@@ -119,8 +119,20 @@ pub fn convert_option_string(value: &str) -> Option<String> {
}
}
-pub fn fuzzy_match(choice: &str, pattern: &str) -> Option<i64> {
- SkimMatcherV2::default().fuzzy_match(choice, pattern)
+pub fn fuzzy_filter<T, F>(values: Vec<T>, get: F, pattern: &str) -> Vec<T>
+where
+ F: Fn(&T) -> &str,
+{
+ let matcher = SkimMatcherV2::default();
+ let mut list: Vec<(T, i64)> = values
+ .into_iter()
+ .filter_map(|v| {
+ let score = matcher.fuzzy_match(get(&v), pattern)?;
+ Some((v, score))
+ })
+ .collect();
+ list.sort_unstable_by(|a, b| b.1.cmp(&a.1));
+ list.into_iter().map(|(v, _)| v).collect()
}
pub fn pretty_error(err: &anyhow::Error) -> String {