use regex::Regex;
use std::path::{Path, PathBuf};
use strsim::jaro_winkler;
const FUZZY_SEARCH: &str = r".*";
pub fn build_regex_search_input(
search_input: Option<&str>,
file_ext: Option<&str>,
strict: bool,
ignore_case: bool,
) -> Regex {
let file_type = file_ext.unwrap_or("*");
let search_input = search_input.unwrap_or(r"\w+");
let mut formatted_search_input = if strict {
format!(r#"{search_input}\.{file_type}$"#)
} else {
format!(r#"{search_input}{FUZZY_SEARCH}\.{file_type}$"#)
};
if ignore_case {
formatted_search_input = set_case_insensitive(&formatted_search_input);
}
Regex::new(&formatted_search_input).unwrap()
}
fn set_case_insensitive(formatted_search_input: &str) -> String {
"(?i)".to_owned() + formatted_search_input
}
pub fn replace_tilde_with_home_dir(path: impl AsRef<Path>) -> PathBuf {
let path = path.as_ref();
if path.starts_with("~") {
if let Some(home_dir) = dirs::home_dir() {
return home_dir.join(path.strip_prefix("~").unwrap());
}
}
path.to_path_buf()
}
fn file_name_from_path(path: &str) -> String {
let path = Path::new(path);
let file_name = path.file_name().unwrap().to_str().unwrap();
file_name.to_string()
}
pub fn similarity_sort(vector: &mut [String], input: &str) {
vector.sort_by(|a, b| {
let input = input.to_lowercase();
let a = file_name_from_path(a).to_lowercase();
let b = file_name_from_path(b).to_lowercase();
let a = jaro_winkler(a.as_str(), input.as_str());
let b = jaro_winkler(b.as_str(), input.as_str());
b.partial_cmp(&a).unwrap()
});
}