pub trait Searchable {
fn get_search_vec(&self) -> Vec<String>;
}
pub fn get_search_string(object: &dyn Searchable) -> String {
object.get_search_vec().join(" ")
}
pub fn clean_search_vec(vec: &[String]) -> Vec<String> {
let mut vec: Vec<String> = vec.join(" ").split_whitespace().map(String::from).collect();
vec = vec.iter().map(|x| x.to_lowercase()).collect();
vec = vec
.iter()
.map(|x| x.replace('.', ""))
.map(|x| x.replace(',', ""))
.map(|x| x.replace('(', ""))
.map(|x| x.replace(')', ""))
.map(|x| x.replace(';', ""))
.map(|x| x.replace(':', " "))
.collect();
vec.sort();
vec.dedup();
vec.retain(|x| !x.eq_ignore_ascii_case("creature"));
vec.retain(|x| !x.eq_ignore_ascii_case("all"));
vec.retain(|x| !x.eq_ignore_ascii_case("the"));
vec.retain(|x| !x.eq_ignore_ascii_case("of"));
vec.retain(|x| !x.eq_ignore_ascii_case("in"));
vec.retain(|x| !x.eq_ignore_ascii_case("and"));
vec.retain(|x| !x.eq_ignore_ascii_case("a"));
vec.retain(|x| !x.eq_ignore_ascii_case("an"));
vec.retain(|x| !x.eq_ignore_ascii_case("with"));
vec
}