Skip to main content

crosswords/
lib.rs

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}