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
use std::collections::HashMap; use rustdoc_types::*; use crate::approx::{Approximate, Similarity}; use crate::types::Query; pub struct QueryExecutor { krate: Crate, } impl QueryExecutor { pub fn new(krate: Crate) -> Self { Self { krate } } pub fn exec(&self, query: Query) -> Vec<&Item> { let mut items_with_sims = Vec::new(); for item in self.krate.index.values() { match item.inner { ItemEnum::Function(_) => { let mut sims = query.approx(item, &Generics::default(), &mut HashMap::new()); sims.sort(); if sims.iter().any(|sim| sim != &Similarity::Different) { items_with_sims.push((&item.id, sims)) } } _ => (), } } items_with_sims.sort_by(|(_, a), (_, b)| a.cmp(b)); items_with_sims .into_iter() .map(|(id, _)| id) .map(|id| self.krate.index.get(id).unwrap()) .collect() } }