1use std::fs::File;
2use std::io;
3use std::io::BufRead;
4
5use itertools::Itertools;
6use levenshtein::levenshtein;
7
8
9
10pub fn sort_string(word: &String) -> String {
11 let mut sorted_word = word.trim().to_string();
12 sorted_word.make_ascii_lowercase();
13 sorted_word = sorted_word.chars().sorted().collect();
14
15 sorted_word
16}
17
18
19pub fn expand_umlauts(word: &str) -> String {
20 let mut umlaut_word = String::from(word);
21
22 umlaut_word = umlaut_word.replace('ä', "ae");
23 umlaut_word = umlaut_word.replace('ö', "oe");
24 umlaut_word = umlaut_word.replace('ü', "ue");
25 umlaut_word = umlaut_word.replace('ß', "ss");
26
27 umlaut_word
28}
29
30
31pub fn read_dict_file(filepath: &str) -> Vec<String> {
32 let file = File::open(filepath).unwrap();
33
34 let line_reader = io::BufReader::new(file).lines();
35
36 let collected_words: Vec<String> = line_reader.collect::<Result<_, _>>().unwrap();
37
38 collected_words.iter().map(|s| expand_umlauts(s)).collect()
39}
40
41pub fn fuzzy_match(lines: &Vec<String>, fuzzy_word: &String) -> Vec<String> {
42 let mut matching_words: Vec<String> = Vec::new();
43
44 let mut stripped_word = String::from(fuzzy_word);
45
46
47 let mut num_wildcards = 0;
48
49 while stripped_word.contains('*') {
50 stripped_word.remove(stripped_word.find('*').unwrap());
51 num_wildcards += 1;
52 }
53
54 for word in lines {
55 if fuzzy_word.len() != word.len() {
56 continue;
57 }
58
59 if levenshtein(&sort_string(&stripped_word), &sort_string(&word)) == num_wildcards {
60 matching_words.push(String::from(word));
61 }
62 }
63
64 matching_words
65}