use strsim::damerau_levenshtein;
use whippyunits_core::Dimension;
pub fn find_similar_dimensions(unknown_dimension: &str, threshold: f64) -> Vec<(String, f64)> {
let mut suggestions = Vec::new();
let all_dimensions = get_all_available_dimensions();
for dimension_name in all_dimensions {
let similarity = calculate_similarity(unknown_dimension, &dimension_name);
if similarity >= threshold {
suggestions.push((dimension_name, similarity));
}
}
suggestions.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap_or(std::cmp::Ordering::Equal));
suggestions.truncate(3);
suggestions
}
fn calculate_similarity(s1: &str, s2: &str) -> f64 {
let distance = damerau_levenshtein(s1, s2);
let max_len = s1.len().max(s2.len()) as f64;
if max_len == 0.0 {
1.0
} else {
1.0 - (distance as f64 / max_len)
}
}
fn get_all_available_dimensions() -> Vec<String> {
let mut dimensions = Vec::new();
for dimension in Dimension::ALL {
dimensions.push(dimension.name.to_string());
dimensions.push(dimension.symbol.to_string());
}
dimensions.sort();
dimensions.dedup();
dimensions
}