use rustdoc_types::{
Deprecation, ExternalCrate, Id, ItemEnum, ItemSummary, Span, Target,
Visibility,
};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Item {
pub id: Id,
pub crate_id: u32,
pub name: Option<String>,
pub span: Option<Span>,
pub visibility: Visibility,
pub docs: Option<String>,
pub links: HashMap<String, Id>,
pub attrs: Vec<String>,
pub deprecation: Option<Deprecation>,
pub inner: ItemEnum,
}
pub trait CommonCrates: Send + Sync {
fn root_id(&self) -> Id;
fn crate_version(&self) -> String;
fn index(&self) -> HashMap<Id, Item>;
}
impl CommonCrates for rustdoc_types::Crate {
fn root_id(&self) -> Id {
self.root
}
fn crate_version(&self) -> String {
self.crate_version.clone().unwrap_or("latest".to_string())
}
fn index(&self) -> HashMap<Id, Item> {
let mut hash_map = HashMap::with_capacity(self.index.len());
for (&id, item) in &self.index {
let converted_item = Item {
id: item.id,
crate_id: item.crate_id,
name: item.name.clone(),
span: item.span.clone(),
visibility: item.visibility.clone(),
docs: item.docs.clone(),
links: item.links.clone(),
attrs: item
.attrs
.iter()
.filter_map(|attr| serde_json::to_string(attr).ok())
.collect(),
deprecation: item.deprecation.clone(),
inner: item.inner.clone(),
};
hash_map.insert(id, converted_item);
}
hash_map
}
}
impl CommonCrates for Crate {
fn root_id(&self) -> Id {
self.root
}
fn crate_version(&self) -> String {
self.crate_version.clone().unwrap_or("latest".to_string())
}
fn index(&self) -> HashMap<Id, Item> {
self.index.clone()
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Crate {
pub root: Id,
pub crate_version: Option<String>,
pub includes_private: bool,
pub index: HashMap<Id, Item>,
pub paths: HashMap<Id, ItemSummary>,
pub external_crates: HashMap<u32, ExternalCrate>,
pub target: Target,
pub format_version: u32,
}