From c382a121a51f788f5a5252fac60072f033967d7d Mon Sep 17 00:00:00 2001 From: Armin Friedl Date: Tue, 26 Oct 2021 09:19:36 +0200 Subject: [PATCH] Add fuse matcher --- Cargo.lock | 7 +++++++ Cargo.toml | 3 ++- src/main.rs | 4 ++-- src/matcher/fuse.rs | 33 +++++++++++++++++++++++++++++++++ src/matcher/mod.rs | 3 +++ src/roftl.rs | 1 - 6 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 src/matcher/fuse.rs diff --git a/Cargo.lock b/Cargo.lock index df08eab..1098b4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -420,6 +420,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" +[[package]] +name = "fuse-rust" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d9ff709b73b2baf07e03076ffe6fb9a6e7309e67651d650e2775729a4fc0eaf" + [[package]] name = "futures-channel" version = "0.3.17" @@ -1087,6 +1093,7 @@ dependencies = [ "cairo-sys-rs", "env_logger", "freedesktop_entry_parser", + "fuse-rust", "fuzzy-matcher", "log", "mlua", diff --git a/Cargo.toml b/Cargo.toml index 9b80172..fd8a996 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,5 @@ fuzzy-matcher = "0.3.7" walkdir = "2.3.2" freedesktop_entry_parser = "1.2.0" mlua = { version = "0.6", features = ["lua54", "vendored"] } -nix = "0.23.0" \ No newline at end of file +nix = "0.23.0" +fuse-rust = "0.3.0" \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index f2f7b39..aa8a2b3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ use winit::event_loop::{ControlFlow, EventLoop}; use winit::event::{ElementState, Event, KeyboardInput, VirtualKeyCode, WindowEvent::{CloseRequested, ReceivedCharacter}}; -use crate::matcher::SkimMatcher; +use crate::matcher::{FuseMatcher, SkimMatcher}; mod roftl; mod ui; @@ -24,7 +24,7 @@ fn main() -> Result<(), Box> { .add_source(sources::Window::new()) .add_source(sources::Apps::new()) .add_source(sources::LuaHost::new()) - .with_matcher(SkimMatcher::new()); + .with_matcher(FuseMatcher::new()); debug!{"Source roftl sources"} roftl.source(); diff --git a/src/matcher/fuse.rs b/src/matcher/fuse.rs new file mode 100644 index 0000000..6dda7d2 --- /dev/null +++ b/src/matcher/fuse.rs @@ -0,0 +1,33 @@ +use std::ops::Range; + +use fuse_rust::Fuse; + +use crate::roftl::Matcher; + +fn flatten_ranges(ranges: Vec>) -> Vec { + ranges.into_iter().flat_map(|range| {range.collect::>().into_iter()}) + .collect() +} + +pub struct FuseMatcher { + matcher: Fuse +} + +impl FuseMatcher { + pub fn new() -> Box { + Box::new(FuseMatcher{ + matcher: Fuse::default() + }) + } +} + +impl Matcher for FuseMatcher { + fn try_match(&self, haystack: &str, needle: &str) -> Option<(f64, Vec)> { + match self.matcher.search_text_in_string(needle, haystack) { + Some(score) => Some((score.score, flatten_ranges(score.ranges))), + None => None + } + } +} + + diff --git a/src/matcher/mod.rs b/src/matcher/mod.rs index be98d1c..8bc5656 100644 --- a/src/matcher/mod.rs +++ b/src/matcher/mod.rs @@ -3,3 +3,6 @@ pub use prefix::PrefixMatcher; mod skim; pub use skim::SkimMatcher; + +mod fuse; +pub use fuse::FuseMatcher; diff --git a/src/roftl.rs b/src/roftl.rs index 4716407..666f671 100644 --- a/src/roftl.rs +++ b/src/roftl.rs @@ -1,6 +1,5 @@ use std::{collections::HashMap, sync::{Arc, Mutex, atomic::{AtomicUsize, Ordering}}, usize}; - use log::debug; use rayon::{iter::{IndexedParallelIterator, IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelIterator}, slice::ParallelSliceMut};