1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use crate::bonus;
use crate::config::Config;

pub struct Choice<'a> {
    pub searchable:  &'a str,
    pub lower_searchable:  Vec<char>,
    pub searchable_len: usize,
    pub returnable: &'a str,
    pub bonus: Vec<f32>,
}

impl<'a> Choice<'a> {
    pub fn new(content: &'a str, config: &Config) -> Choice<'a> {
        match &config.delimiter {
            Some(delimiter_regex) => {
                let split_content: Vec<&str> = delimiter_regex.split(content).collect();

                let searchable = split_content[config.field.unwrap()];
                let returnable = match config.output {
                    Some(o) => split_content[o],
                    None => searchable
                };

                let (bonus, searchable_len, lower_searchable) = parse_searchable(&searchable);

                Choice { searchable, returnable, bonus, searchable_len, lower_searchable }
            },
            None => {
                let (bonus, searchable_len, lower_searchable) = parse_searchable(&content);

                Choice { searchable: content, returnable: content, bonus, searchable_len, lower_searchable }
            }
        }
    }

}

fn parse_searchable(searchable: &str) -> (Vec<f32>, usize, Vec<char>) {
    let bonus = bonus::compute(&searchable.chars().collect::<Vec<char>>());
    let searchable_len = searchable.chars().count();
    let lower_searchable: Vec<char> = searchable.chars().map(|cchar| cchar.to_ascii_lowercase()).collect();

    (bonus, searchable_len, lower_searchable)
}