use regex::Regex;
use std::path::{Path, PathBuf};
use strsim::jaro_winkler;
pub(crate) 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+");
const FUZZY_SEARCH: &str = r".*";
let mut formatted_search_input;
if strict {
formatted_search_input = format!(r#"{}\.{}$"#, search_input, file_type);
} else {
formatted_search_input = 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(crate) 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();
return file_name.to_string();
}
pub fn similarity_sort(vector: &mut Vec<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()
});
}