1use ide_db::{
2 FileId, FxIndexSet, RootDatabase,
3 base_db::{CrateOrigin, RootQueryDb},
4};
5
6#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub struct CrateInfo {
8 pub name: Option<String>,
9 pub version: Option<String>,
10 pub root_file_id: FileId,
11}
12
13pub(crate) fn fetch_crates(db: &RootDatabase) -> FxIndexSet<CrateInfo> {
23 db.all_crates()
24 .iter()
25 .copied()
26 .map(|crate_id| (crate_id.data(db), crate_id.extra_data(db)))
27 .filter(|(data, _)| !matches!(data.origin, CrateOrigin::Local { .. }))
28 .map(|(data, extra_data)| crate_info(data, extra_data))
29 .collect()
30}
31
32fn crate_info(
33 data: &ide_db::base_db::BuiltCrateData,
34 extra_data: &ide_db::base_db::ExtraCrateData,
35) -> CrateInfo {
36 let crate_name = crate_name(extra_data);
37 let version = extra_data.version.clone();
38 CrateInfo { name: crate_name, version, root_file_id: data.root_file_id }
39}
40
41fn crate_name(data: &ide_db::base_db::ExtraCrateData) -> Option<String> {
42 data.display_name.as_ref().map(|it| it.canonical_name().as_str().to_owned())
43}