racer_cargo_metadata/
metadata.rs

1//! Data structures for metadata
2use racer_interner::InternedString;
3use std::path::PathBuf;
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6pub struct Metadata {
7    pub packages: Vec<Package>,
8    pub workspace_members: Vec<PackageId>,
9    pub resolve: Option<Resolve>,
10    #[serde(default)]
11    pub workspace_root: PathBuf,
12    pub target_directory: PathBuf,
13    version: usize,
14    #[serde(skip)]
15    __guard: (),
16}
17
18#[derive(Clone, Debug, Serialize, Deserialize)]
19pub struct Package {
20    pub id: PackageId,
21    pub targets: Vec<Target>,
22    pub manifest_path: PathBuf,
23    #[serde(default = "edition_default")]
24    pub edition: InternedString,
25    #[serde(skip)]
26    __guard: (),
27}
28
29#[derive(Clone, Debug, Serialize, Deserialize)]
30pub struct Resolve {
31    pub nodes: Vec<ResolveNode>,
32    #[serde(skip)]
33    __guard: (),
34}
35
36#[derive(Clone, Debug, Serialize, Deserialize)]
37pub struct ResolveNode {
38    pub id: PackageId,
39    pub dependencies: Vec<PackageId>,
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize)]
43pub struct Target {
44    pub name: InternedString,
45    pub kind: Vec<InternedString>,
46    pub src_path: PathBuf,
47    #[serde(default = "edition_default")]
48    pub edition: InternedString,
49    #[serde(skip)]
50    __guard: (),
51}
52
53const LIB_KINDS: [&'static str; 4] = ["lib", "rlib", "dylib", "proc-macro"];
54
55impl Target {
56    pub fn is_lib(&self) -> bool {
57        self.kind.iter().any(|k| LIB_KINDS.contains(&k.as_str()))
58    }
59    pub fn is_2015(&self) -> bool {
60        self.edition.as_str() == "2015"
61    }
62}
63
64#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
65pub struct PackageId(InternedString);
66
67impl PackageId {
68    pub fn name(&self) -> &str {
69        let idx = self.0.find(' ').expect("Whitespace not found");
70        &self.0[..idx]
71    }
72}
73
74#[inline(always)]
75fn edition_default() -> InternedString {
76    InternedString::new("2015")
77}