Skip to main content

fli/
lib.rs

1pub mod app;
2pub mod command;
3pub mod display;
4pub mod error;
5pub mod macros;
6pub mod option_parser;
7pub use app::Fli;
8pub use error::{FliError, Result};
9
10use colored::Colorize;
11#[cfg(test)]
12pub mod tests;
13
14pub fn add(left: usize, right: usize) -> usize {
15    left + right
16}
17
18/// Calculate Levenshtein distance between two strings
19pub fn levenshtein_distance(s1: &str, s2: &str) -> usize {
20    let len1 = s1.len();
21    let len2 = s2.len();
22    
23    if len1 == 0 { return len2; }
24    if len2 == 0 { return len1; }
25    
26    let mut matrix = vec![vec![0; len2 + 1]; len1 + 1];
27    
28    for i in 0..=len1 {
29        matrix[i][0] = i;
30    }
31    for j in 0..=len2 {
32        matrix[0][j] = j;
33    }
34    
35    for (i, c1) in s1.chars().enumerate() {
36        for (j, c2) in s2.chars().enumerate() {
37            let cost = if c1 == c2 { 0 } else { 1 };
38            matrix[i + 1][j + 1] = (matrix[i][j + 1] + 1)
39                .min(matrix[i + 1][j] + 1)
40                .min(matrix[i][j] + cost);
41        }
42    }
43    
44    matrix[len1][len2]
45}
46
47
48
49/// Find similar strings based on Levenshtein distance
50pub fn find_similar<'a>(
51    target: &str,
52    candidates: &'a [String],
53    max_distance: usize,
54) -> Vec<&'a String> {
55    candidates
56        .iter()
57        .filter(|candidate| levenshtein_distance(target, candidate) <= max_distance)
58        .collect()
59}