diff --git a/Cargo.lock b/Cargo.lock index d50f6aa..69fa67e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3858,6 +3858,7 @@ dependencies = [ "libcosmic", "miette", "pretty_assertions", + "rapidfuzz", "rapidhash", "rayon", "resvg 0.45.1", @@ -5343,6 +5344,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" +[[package]] +name = "rapidfuzz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "270e04e5ea61d40841942bb15e451c29ee1618637bcf97fc7ede5dd4a9b1601b" + [[package]] name = "rapidhash" version = "4.0.0" diff --git a/Cargo.toml b/Cargo.toml index 8ab9d45..df13e63 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ rayon = "1.11.0" resvg = "0.45.1" image = "0.25.8" rapidhash = "4.0.0" +rapidfuzz = "0.5.0" # femtovg = { version = "0.16.0", features = ["wgpu"] } # wgpu = "26.0.1" # mupdf = "0.5.0" diff --git a/src/ui/library.rs b/src/ui/library.rs index c5d2717..69fc177 100644 --- a/src/ui/library.rs +++ b/src/ui/library.rs @@ -14,6 +14,7 @@ use cosmic::{ Element, Task, }; use miette::{IntoDiagnostic, Result}; +use rapidfuzz::distance::levenshtein; use sqlx::{pool::PoolConnection, Sqlite, SqlitePool}; use tracing::{debug, error, warn}; @@ -570,15 +571,52 @@ impl<'a> Library { &self, query: String, ) -> Vec { - let song1 = Song { - title: "Death Was Arrested".to_string(), - ..Default::default() - }; - let song2 = Song { - title: "Smelly_Belly".to_string(), - ..Default::default() - }; - vec![ServiceItem::from(&song1), ServiceItem::from(&song2)] + let mut items: Vec = self + .song_library + .items + .iter() + .filter(|song| song.title.contains(&query)) + .map(|song| song.to_service_item()) + .collect(); + let videos: Vec = self + .video_library + .items + .iter() + .filter(|vid| vid.title.contains(&query)) + .map(|vid| vid.to_service_item()) + .collect(); + let images: Vec = self + .image_library + .items + .iter() + .filter(|image| image.title.contains(&query)) + .map(|image| image.to_service_item()) + .collect(); + let presentations: Vec = self + .presentation_library + .items + .iter() + .filter(|pres| pres.title.contains(&query)) + .map(|pres| pres.to_service_item()) + .collect(); + items.extend(videos); + items.extend(images); + items.extend(presentations); + let mut items: Vec<(usize, ServiceItem)> = items + .into_iter() + .map(|item| { + ( + levenshtein::distance( + query.bytes(), + item.title.bytes(), + ), + item, + ) + }) + .collect(); + + items.sort_by(|a, b| a.0.cmp(&b.0)); + items.into_iter().map(|item| item.1).collect() } // fn update_item(self, item: C) -> Task {