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) }