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
18pub 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
49pub 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}